Eu tenho um servidor Ubuntu 10.10 com muita RAM, largura de banda e CPU. Estou vendo um padrão estranho e repetitivo na distribuição de latências ao servir arquivos estáticos do Apache e do nginx. Como o problema é comum a ambos os servidores http, estou me perguntando se configuramos mal ou mal sintonizamos os parâmetros de rede ou cache do Ubuntu.
ab -n 1000 -c 4 http://apache-host/static-file.jpg
:
Percentage of the requests served within a certain time (ms)
50% 5
66% 3007
75% 3009
80% 3011
90% 9021
95% 9032
98% 21068
99% 45105
100% 45105 (longest request)
ab -n 1000 -c 4 http://nginx-host/static-file.jpg
:
Percentage of the requests served within a certain time (ms)
50% 19
66% 19
75% 3011
80% 3017
90% 9021
95% 12026
98% 12028
99% 18063
100% 18063 (longest request)
Os resultados seguem consistentemente esse tipo de padrão - 50% ou mais das solicitações são atendidas como esperado, depois o restante cai em bandas discretas, com as mais lentas algumas ordens de magnitude mais lentas.
O Apache é 2.xe tem o mod_php instalado. O nginx é 1.0.xe tem o Passenger instalado (mas nenhum servidor de aplicativos deve estar no caminho crítico para um arquivo estático). A média de carga foi em torno de 1 quando cada teste foi executado (o servidor tem 12 núcleos físicos). 5 GB de RAM livre, troca em cache de 7 GB. Os testes foram executados a partir do host local.
Aqui estão as alterações de configuração que eu fiz nos padrões do Ubuntu 10.10:
/etc/sysctl.conf:
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 16777216 16777216 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.route.flush = 1
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1
net.core.somaxconn = 8192
/etc/security/limits.conf:
* hard nofile 65535
* soft nofile 65535
root hard nofile 65535
root soft nofile 65535
other config:
ifconfig eth0 txqueuelen 1000
Por favor, deixe-me saber se este tipo de problema toca algum sinal, ou se mais informações sobre a configuração seriam úteis. Obrigado pelo seu tempo.
Atualização: Veja o que estou vendo depois de aumentar net.netfilter.nf_conntrack_max
conforme sugerido abaixo:
Percentage of the requests served within a certain time (ms)
50% 2
66% 2
75% 2
80% 2
90% 3
95% 3
98% 3
99% 3
100% 5 (longest request)