У меня есть сервер 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