Назад | Перейти на главную страницу

Задержка HTTP в Ubuntu попадает в странные квантили

У меня есть сервер Ubuntu 10.10 с большим количеством оперативной памяти, пропускной способности и процессора. Я наблюдаю странную повторяющуюся закономерность в распределении задержек при обслуживании статических файлов как из Apache, так и из nginx. Поскольку проблема является общей для обоих http-серверов, мне интересно, неправильно ли я настроил или плохо настроил параметры сети или кеша 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)

Результаты последовательно следуют такой схеме - 50% или более запросов обслуживаются, как ожидалось, затем оставшаяся часть попадает в дискретные диапазоны, причем самый медленный на несколько порядков медленнее.

Apache - это 2.x и установлен mod_php. nginx - это 1.0.x, и на нем установлен Passenger (но ни один сервер приложений не должен находиться в критическом пути для статического файла). Средняя нагрузка была около 1 при запуске каждого теста (на сервере 12 физических ядер). 5 ГБ свободной оперативной памяти, 7 ГБ кэшированного свопа. Тесты проводились с localhost.

Вот изменения, которые я внес в настройки по умолчанию на сервере 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

Пожалуйста, дайте мне знать, если возникнут проблемы такого рода или будет полезна дополнительная информация о конфигурации. Спасибо за ваше время.

Обновить: Вот что я вижу после увеличения net.netfilter.nf_conntrack_max как предлагается ниже:

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)

Исходя из вашего комментария, это был nf_conntrack Полная проблема, вы можете либо увеличить таблицу conntrak:

sysctl -w net.netfilter.nf_conntrack_max=131072

Или, если вы уже находитесь за брандмауэром, вы можете просто исключить HTTP-трафик из отслеживания соединений:

# 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