Высокий IO на серверах с nginx
Alexey Malov
scukonick на gmail.com
Сб Июл 11 22:09:13 UTC 2015
Добрый день,
Второй день наблюдаю проблему с высоким IO на серверах с nginx при не очень
большой нагрузке.
Схема такая - 11 серверов с nginx и tomcat. Nginx на каждому сервере
принимает трафик от CloudFlare CDN, большую часть отдаёт из кеша, остальное
балансирует на томкаты (и ещё один статический файлик отдаёт сам).
Всё было замечательно до вчера, трафик в пике был до 40 мегабайтов в
секунду, 40к параллельных соединений и ~1500 запросов в секунду на каждом
из серверов.
Вчера же трафик подскочил раза в полтора (сбрасывали кеш на CloudFlare и
сами запросы тоже поменялись), резко выроз IO на сервере (раньше его вообще
практически не было, а стало около 15-20%) и всё начало тупить.
Изначально думали на диск, но отключение логов практически никак не
повлияло.
В dmesg стали вылезать сообщения про synflood, увеличили бэклоги как в
nginx, так и в sysctl, сообщения про synflood пропали, но проблема с IO
осталась.
Немного помогло отключение лоад-балансинга в nginx, теперь каждый nginx
проксирует на локальный томкат. Нагрузка на сеть понизилась, IO понизилось,
но всё равно осталось.
Трафик с тех пор понизился даже ниже, чем был до проблемы, сейчас около
1100 запросов в секунду. Но IO осталось. Nginx даже иногда по нескольку
секунд отвечает на запросы к странице stub_status.
Пробовали разделять сервера с tomcat и nginx, IO оставалось на стороне
nginx.
Был бы очень признателен, если бы кто-нибудь подсказал хотя бы куда копать.
Потому что уже вроде как чем только не пробовали. Спасибо заранее!
Конфиги следующие:
nginx.conf:
user nginx;
worker_processes 8;
worker_rlimit_nofile 512000;
worker_rlimit_core 500M;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 256000;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
log_format main '$remote_addr - $remote_user [$time_local] "$request"
'
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format upstream_balancing '$remote_addr - $remote_user
[$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$upstream_addr" "$upstream_response_time"
"$geoip_country_code/$http_cf_ipcountry" "$http_host"
"$upstream_cache_status" '
'"$http_cf_connecting_ip"';
log_format ub_cloudflare '$http_cf_connecting_ip - $remote_user
[$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$upstream_addr" "$upstream_response_time"
"$geoip_country_code/$http_cf_ipcountry" "$http_host"
"$upstream_cache_status" '
'"$remote_addr" "$cookie___cfduid" "$cookie_uid"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
proxy_cache_methods GET;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
virtual host:
server {
listen 1.1.1.1:80;
listen 1.1.1.1:443 ssl;
ssl_certificate /etc/nginx/ssl/cert.crt;
ssl_certificate_key /etc/nginx/ssl/key.key;
server_name example.com;
proxy_set_header clientCountryCode $http_cf_ipcountry ;
proxy_ignore_headers "Set-Cookie";
proxy_hide_header "Set-Cookie";
proxy_next_upstream error timeout http_500;
location / {
deny all;
}
location /manager {
proxy_pass http://127.0.0.1:5885;
}
location /crossdomain.xml {
root /tomcat/static_xml;
expires 31d;
}
location ~ ^(/display.htm)$ {
proxy_pass http://127.0.0.1:5885/banners/$1$is_args$args;
proxy_cache exe_cache;
proxy_cache_valid 2h;
expires 24h;
}
location ~ ^(/secure.jsp)$ {
proxy_pass http://127.0.0.1:5885/banners/mojo/$1$is_args$args;
proxy_cache exe_cache;
proxy_cache_valid 2h;
expires 12h;
}
location ~ ^(/hela.jsp)$ {
proxy_pass http://127.0.0.1:5885/banners/hela$1$is_args$args;
proxy_cache exe_cache;
proxy_cache_valid 2h;
expires 12h;
}
location ~ ^(/hela.exe)$ {
proxy_pass http://127.0.0.1:5885/banners/hela$1$is_args$args;
proxy_cache exe_cache;
proxy_cache_valid 24h;
}
location /wl/ba.jsp {
proxy_pass http://127.0.0.1:5885/banners/wl/ba.jsp;
#proxy_cache_key proxy_cache_key;
proxy_cache exe_cache;
proxy_cache_valid 200 48h;
expires 1w;
}
location /wl/po.jsp {
proxy_pass http://127.0.0.1:5885/banners/wl/po.jsp;
proxy_cache exe_cache;
proxy_cache_valid 200 48h;
expires 1w;
}
location /tg.jsp {
proxy_pass http://127.0.0.1:5885/banners/ba/tg.jsp;
#proxy_cache_key proxy_cache_key;
proxy_cache_key
$http_host$scheme$proxy_host$uri$is_args$arg_ger$arg_cst$arg__v$arg_t;
proxy_cache exe_cache;
proxy_cache_valid 200 48h;
proxy_ignore_headers "Set-Cookie";
add_header Cache-Control public;
expires 36h;
}
location ~ ^/_(a|b|c|d|e|f|m|x|i|h)\.jsp$ {
proxy_pass http://127.0.0.1:5885/banners/ba/_$1.jsp$is_args$args;
proxy_cache_key
$http_host$scheme$proxy_host$uri$is_args$arg_tc$arg_t$arg_callback;
proxy_cache exe_cache;
proxy_cache_valid 200 8h;
proxy_ignore_headers "Set-Cookie";
expires 8h;
deny all;
}
location /api/v1/stabucket {
proxy_pass
http://127.0.0.1:5885/adsnetto_backend/api/v1/stabucket$is_args$args;
proxy_cache_key
$http_host$scheme$proxy_host$uri$is_args$arg_tc$arg_t$arg_callback$arg_r;
proxy_cache exe_cache;
proxy_cache_valid 200 8h;
proxy_ignore_headers "Set-Cookie";
expires 8h;
}
location /_.jsp {
proxy_pass http://127.0.0.1:5885/banners/ba/_.jsp;
proxy_cache_key
$http_host$scheme$proxy_host$uri$is_args$arg_tc$arg_t$arg_callback;
proxy_cache exe_cache;
proxy_cache_valid 200 12h;
proxy_ignore_headers "Set-Cookie";
expires 12h;
}
location /tag_test.jsp {
proxy_pass http://127.0.0.1:5885/banners/ba/tag_test.jsp;
expires 36h;
}
location /clk.action {
proxy_pass http://search.utop.it;
proxy_set_header Host search.utop.it;
}
location /exe {
proxy_pass http://127.0.0.1:5885/banners/exe;
proxy_cache exe_cache;
proxy_cache_valid 200 24h;
}
location /ini.jsp {
proxy_pass http://127.0.0.1:5885/banners/loca/ini.jsp;
proxy_cache exe_cache;
proxy_cache_valid 4h;
expires 12h;
}
location /img/px.png {
alias /tomcat/webapps/banners##1.3/img/px.png;
userid on;
userid_name uid;
userid_domain "example.com; HttpOnly";
userid_expires max;
expires epoch;
}
access_log /var/log/nginx/example.com_access.log ub_cloudflare
buffer=10m flush=1m;
error_log /var/log/nginx/example.com_error.log error;
}
nginx -V:
# nginx -V
nginx version: nginx/1.6.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx
--conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid
--lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx
--with-file-aio --with-ipv6 --with-http_ssl_module
--with-http_realip_module --with-http_addition_module
--with-http_xslt_module --with-http_image_filter_module
--with-http_geoip_module --with-http_sub_module --with-http_dav_module
--with-http_flv_module --with-http_mp4_module
--with-http_gzip_static_module --with-http_random_index_module
--with-http_secure_link_module --with-http_degradation_module
--with-http_stub_status_module --with-debug --with-cc-opt='-O2 -g -pipe
-Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
--param=ssp-buffer-size=4 -m64 -mtune=generic'
В sysctl подкручивали:
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.core.netdev_max_backlog = 65536
net.ipv4.tcp_max_syn_backlog = 262144
net.core.somaxconn = 262144
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.rmem_default = 65536
net.core.wmem_default = 65536
net.ipv4.tcp_rmem = 8192 873800 8388608
net.ipv4.tcp_wmem = 4096 655360 8388608
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries=2
Картина в netstat:
# netstat -ant | grep tcp | tr -s ' ' ' ' | awk '{print $6}' | sort | uniq
-c
8 CLOSE_WAIT
32970 ESTABLISHED
22 FIN_WAIT1
3 LAST_ACK
17 LISTEN
23 SYN_RECV
27976 TIME_WAIT
--
Alexey Malov
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20150711/2b6800fd/attachment.html>
Подробная информация о списке рассылки nginx-ru