Estou escrevendo um servidor de agregação de eventos em Python, usando Nginx + Gunicorn. O sistema é dimensionado para cerca de 300 rps antes que a CPU seja maximizada em uma caixa de 1 cpu / 2 core (AWS c4.large). A adição de um funcionário de gún usão adicional ou o uso de trabalhadores de eventlet apenas ajudam nas margens (cerca de 10%). As respostas estão no intervalo de 1-2ms (os eventos estão sendo gravados no disco).
Da minha análise, parece que o gunicorn está gastando todo o seu tempo e energia lendo a partir do socket (está em sync.py na chamada select ()). O Nginx, por sua vez, está ocupando cerca de 2 a 3% da CPU em si. O uso de soquetes UNIX não alterou o perfil de desempenho nos soquetes de rede.
Como esses eventos são tão pequenos (~ 200 bytes), parece que é preciso um esforço excessivo para o gunicorn retirar a solicitação do soquete. Eu adoraria poder agrupar esses pedidos de alguma forma antes que eles alcancem o gunicorn, mas não tenho idéia de como fazer isso. Existe alguma maneira que eu possa reduzir a quantidade de esforço / CPU que o gunicorn está tomando e aumentar minha taxa de transferência por caixa?