Eu recomendo que você instale o pacote sysstat
e, em seguida, verifique as informações gravadas com sar .
sar -n SOCK -s <start_time> -e <end_time>
para obter a quantidade de soquetes durante o benchmark
sar -n DEV -s <start_time> -e <end_time>
para obter pacotes de interfaces de rede e largura de banda
sar -d -s <start_time> -e <end_time>
para obter estatísticas de io por dispositivo
sar -v -s <start_time> -e <end_time>
para obter o número de identificadores de arquivo e inodes
etc
Verifique os limites de segurança para seus usuários (número máximo de arquivos abertos, número máximo de processos, etc.).
Em seguida, verifique as configurações do kernel: intervalo de portas local, somaxconn, txqueue de dispositivo, netdev backlog, ativar soquete de reciclagem para TIME_WAIT, se necessário (em relação a tcp-tw com sar -n SOCK) com SO_LINGER em nginx ou tcp_tw_recycle (se você não tem NAT) ou reutiliza (para conexões de saída), altere a quantidade de tw_buckets se necessário, certifique-se de que o sack / dsack e os registros de data e hora estejam ativados, reduza o tempo limite FIN_WAIT_2, aumente as manipulações máximas se necessário etc.
Pode haver muitos fatores.
Antes de verificar tudo isso, certifique-se de não executar ab
no mesmo equipamento e que o aplicativo python tenha bons tempos de resposta.
E um teste simples para garantir que o aplicativo python não seja o culpado: o mesmo benchmark em um arquivo estático diretamente do servidor pelo nginx.