Добрый вечер, коллеги
Помогите, пожалуйста, разобраться с тормозами при отдаче статики (файлы порядка 2-4 МБайт, около 700-1000 rps, keep-alive не используется со стороны клиента (!), 99% клиентских сессий - с localhost, отдача начинает тормозить где-то на 2.7-3 Gbps)
проблема выглядит как периодическое "залипание" загрузки файла на некоторый интервал (от долей секунды до нескольких секунд).
Конфигурация:
worker_processes 16;
worker_rlimit_nofile 21000;
worker_priority -5;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
timer_resolution 100ms;
events {
worker_connections 10240;
use epoll;
}
http {
sendfile on;
# sendfile_max_chunk 1m;
open_file_cache max=10240 inactive=300s;
open_file_cache_valid 2000s;
open_file_cache_min_uses 1;
open_file_cache_errors on;
# aio on;
# directio 4k;
# directio_alignment 4k;
# output_buffers 128 512k;
keepalive_timeout 60;
underscores_in_headers on;
server_tokens off;
tcp_nodelay on;
...
}
Всё что закомментировано - проверялось без результата.
Для теста сделал tmpfs (чтобы исключить тормоза HDD), поставил рядом apache2 (чтобы минимизировать вероятность тормозов сетевого стека), с соседнего сервера делаю запрос на файл в tmpfs, apache выдаёт его стабильно с 24-25MBps, nginx тот же файл - в лучшем случае 12MBps,
Затыки также замечаются и на локалхосте. Скорость - от тех же 12MBps до 720MBps. Апач стабильно держит >1GBps. Вот пример времени выполнения запросов с локалхоста:
real 0m4.167s
user 0m0.008s
sys 0m0.042s
real 0m2.085s
user 0m0.006s
sys 0m0.049s
real 0m2.079s
user 0m0.007s
sys 0m0.055s
real 0m0.623s
user 0m0.007s
sys 0m0.064s
real 0m1.225s
user 0m0.004s
sys 0m0.052s
real 0m0.333s
user 0m0.005s
sys 0m0.057s
real 0m2.097s
user 0m0.004s
sys 0m0.058s
ОС: 2.6.32-358.6.2.el6.x86_64 #1 SMP Thu May 16 20:59:36 UTC 2013 x86_64 x86_64 x86_64 GNU/Linuxnet.core.netdev_max_backlog=20480
net.core.rmem_default=131072
net.core.rmem_max=1310720
net.core.somaxconn=2048
net.core.wmem_default=131072
net.core.wmem_max=1310720
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.all.log_martians=1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.secure_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.secure_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.ip_forward=0
net.ipv4.tcp_dsack=1
net.ipv4.tcp_mem=24576 32768 131072
net.ipv4.tcp_rmem=4096 65536 524288
net.ipv4.tcp_sack=1
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_wmem=4096 65536 524288
net.ipv4.udp_mem=8388608 12582912 33554432
net.ipv4.udp_rmem_min=16384
net.ipv4.udp_wmem_min=16384проверялось также с:
net.ipv4.tcp_sack=0
, бОльшими числами в tcp_mem, tcp_wmem
, бОльшим числом worker'ов (до 32)
результат одинаков.
LA на сервере высокий (в основном, из-за чтения с HDD), на 16 ядрах держится около 16.
Что я не так готовлю?