O pior cenário de 3 segundos na sua primeira execução de ab
parece uma perda de pacote. Provavelmente é o resultado de alguns buffers / recursos insuficientes configurados, algumas possíveis causas em nenhuma ordem específica:
- Fila de escuta muito pequena em um back-end resultando em estouros de fila de escuta ocasionais (o Linux geralmente é configurado para soltar o pacote SYN nesse caso, tornando-o indiferenciável de uma perda de pacote; consulte
netstat -s | grep listen
para descobrir se é o problema ). - Firewall com estado no host local aproximando-se do limite de número de estados e descartando alguns pacotes SYN aleatórios devido a isso.
- O sistema está sem sockets / portas locais devido a sockets no estado TIME_WAIT, consulte esta questão se você estiver usando o Linux.
Você tem que examinar seu sistema operacional cuidadosamente para descobrir a causa e configurar seu sistema operacional de acordo. Você também pode querer seguir algum guia de ajuste do subsistema de rede para o seu sistema operacional. Observe que o EC2 pode ser um pouco específico aqui, já que havia relatórios sobre o desempenho de rede muito limitado em instâncias do EC2.
Do ponto de vista do nginx, qualquer solução estaria mais ou menos errada (já que o problema não está no nginx, mas sim no sistema operacional que não pode lidar com o carregamento e descarta pacotes). No entanto, você pode tentar alguns truques para reduzir a carga no subsistema de rede do SO:
- Configure as conexões keepalive com um back-end .
- Configure o backend para escutar em um soquete de domínio unix (se seu backend o suportar) e configure o nginx para solicitações de proxy para ele.