Никак не могу отловить - во что упираются сетевые подключения.
Суть работы сервера:
Сервер занимается сбором статистики с клиентских приложений. На сервере запущен NGINX с простеньким скриптом на LUA, который отправляет полученные с клиента данные(очень небольшой JSON) в RabbitMQ.
Нагрузка в целом не большая - 30 000 RPM (500RPS).
Постоянно наблюдается следующая проблема: Те клиенты, которые в данные момент отправляют данные на сервер - проблем не испытывают. Новые же клиенты - при попытке установить HTTP соединение ожидают секунд по 20-30 с периодическим полным отвалом по таймауту.
Если вместо скрипта на LUA на каждый запрос просто отдавать JSON файлик, то картина никак не меняется.
Т.е. выглядит как проблема с настройкой сети в Linux на этапе установки TCP-подключения при большом количестве таких
Железо
Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz Hexa-core
64GB Ram
LAN 1Gbit
CPU заружен на 20%, Оперативка на 20%.
IOTop не показывает сколько-то значимых обращений к диску.
Конфигурация NGINX примерно такая:
user www-data;
worker_processes auto;
worker_rlimit_nofile 262143;
events {
worker_connections 262143;
multi_accept on;
use epoll;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 10;
}
Перечитаву множество оптимизаций под HighLoad в sysctl прописывал следующее:
fs.file-max=100000
vm.swappiness=10
net.netfilter.nf_conntrack_max=1548576
net.ipv4.ip_local_port_range=10000 65000
net.ipv4.tcp_tw_reuse=1
net.core.somaxconn=15600
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_tw_recycle=1
net.core.rmem_default=31457280
net.core.rmem_max=12582912
net.core.wmem_default=31457280
net.core.wmem_max=12582912
net.core.netdev_max_backlog=65536
net.core.optmem_max=25165824
net.ipv4.tcp_rmem=8192 87380 16777216
net.ipv4.udp_rmem_min=16384
net.ipv4.tcp_wmem=8192 65536 16777216
ifconfig eth0 txqueuelen = 10000 установлен.
Явно где-то есть какой-то bottlneck, но не пойму где. Особого понимания работы TCP стека в Linux нету, поэтому требуется помощь.
Вот например вывод, который к сожалению ни о чем мне лично не говорит, но TimeWait многова-то и что такое Closed.
root@st1 / # ss -s
Total: 296670 (kernel 296893)
TCP: 310953 (estab 2959, closed 307810, orphaned 149, synrecv 0, timewait 14403/0), ports 0
Transport Total IP IPv6
* 296893 - -
RAW 0 0 0
UDP 18 12 6
TCP 3143 3140 3
INET 3161 3152 9
FRAG 0 0 0
Как понять - где застревает "сеть"? В какие ресурсы\значения упирается? С помощью чего вообще такое можно дебажить и какие настройки попробовать еще?