Re: Высокий IO на серверах с nginx
Alexey Malov
scukonick на gmail.com
Сб Июл 11 23:53:24 UTC 2015
Как выяснилось, IO было дисковое, перенос cache в RAM всё излечил. Странно
только, почему раньше работало. Сейчас вариантов URL стало даже меньше. И
трафик опустился.
11 июля 2015 г., 17:57 пользователь Alexey Malov <scukonick на gmail.com>
написал:
>
>
> 11 июля 2015 г., 17:09 пользователь Alexey Malov <scukonick на gmail.com>
> написал:
>
> Добрый день,
>> Второй день наблюдаю проблему с высоким 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
>>
>
> Забыл уточнить, сервера примерно такой конфигурации:
> Intel(R) Xeon(R) CPU E5-1620 v2 (8 core)
> 64GB RAM
>
> Tomcat нагрузку почти не создает, до него доходит в лучшем случае запросов
> 10-15 в секунду.
>
> --
> Alexey Malov
>
--
Alexey Malov
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20150711/940a2c95/attachment.html>
Подробная информация о списке рассылки nginx-ru