Re: Высокий IO на серверах с nginx

Alexey Malov scukonick на gmail.com
Сб Июл 11 22:57:02 UTC 2015


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
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20150711/af71dd57/attachment.html>


Подробная информация о списке рассылки nginx-ru