A latência do Ubuntu HTTP caindo em quantis estranhos

4

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)
    
por slowernet 25.10.2011 / 21:44

1 resposta

6

Desativando seu comentário de que era o problema nf_conntrack full, você pode aumentar a tabela conntrak:

sysctl -w net.netfilter.nf_conntrack_max=131072

Ou, se já estiver protegido por um firewall, você pode apenas isentar o tráfego HTTP do rastreamento de conexão:

# iptables -L -t raw
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    tcp  --  anywhere             anywhere            tcp dpt:www 
NOTRACK    tcp  --  anywhere             anywhere            tcp spt:www 

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
NOTRACK    tcp  --  anywhere             anywhere            tcp spt:www 
NOTRACK    tcp  --  anywhere             anywhere            tcp dpt:www
    
por 25.10.2011 / 23:24