Я пишу сервер агрегации событий на Python, используя Nginx + Gunicorn. Система масштабируется примерно до 300 об / с, прежде чем ЦП исчерпает максимум на 1 процессор / 2 ядра (AWS c4.large). Добавление дополнительного работника-пулеметчика или использование обработчика событийного типа помогает только на полях (около 10%). Ответы находятся в диапазоне 1-2 мс (события записываются на диск).
Из моего анализа кажется, что Gunicorn тратит все свое время и энергию на чтение из сокета (он синхронизируется с вызовом select ()). Между тем, Nginx занимает около 2-3% самого процессора. Использование сокетов UNIX не повлияло на профиль производительности сетевых сокетов.
Поскольку эти события настолько малы (~ 200 байт), похоже, что Gunicorn требуется чрезмерное количество усилий, чтобы получить запрос от сокета. Я бы хотел иметь возможность каким-то образом пакетировать эти полезные нагрузки до того, как они достигнут Gunicorn, но я понятия не имею, как это сделать. Есть ли способ уменьшить количество усилий / ресурсов процессора, которые берет на себя Gunicorn, и увеличить пропускную способность на коробку?