Задать вопрос

Проблемы с TCP соединениями в Linux. Как победить?

Никак не могу отловить - во что упираются сетевые подключения.
Суть работы сервера:
Сервер занимается сбором статистики с клиентских приложений. На сервере запущен 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


Как понять - где застревает "сеть"? В какие ресурсы\значения упирается? С помощью чего вообще такое можно дебажить и какие настройки попробовать еще?
  • Вопрос задан
  • 1984 просмотра
Подписаться 5 Оценить Комментировать
Ответ пользователя Владимир К ответам на вопрос (5)
# sysctl net.ipv4.tcp_syncookies
# sysctl net.ipv4.tcp_max_syn_backlog
# cat /proc/ngix_master_PID/limits
# cat /proc/ngix_worker_PID/limits
Ответ написан
Комментировать