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

Проблемы с 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


Как понять - где застревает "сеть"? В какие ресурсы\значения упирается? С помощью чего вообще такое можно дебажить и какие настройки попробовать еще?
  • Вопрос задан
  • 1954 просмотра
Подписаться 5 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
kaiten
@kaiten
Архитектор ИС
На сервере есть фаервол?
На сервере есть натирование? Возможно вы уперлись в данные настройки, по умолчанию iptables имеет очень ограниченные настройки на кол-во Нат сессий
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
backlog крутите.
Ответ написан
Комментировать
pavlinux
@pavlinux
Перечитаву множество оптимизаций под HighLoad

HighLoad - это 1000 кластеров из 50 стоек, по 10 блейдов, соеденнёных через Infiniband, работающих 24/7/365, с простоем 5 минут в год.
---

IPv6 нужен? Нет! Вырубить!
Ping до роутера из вне, с сервера?
RSS? delay?

ifconfig eth0 txqueuelen = 10000 лишнее. Это для сетевух 10Gb и дальше.
таблица маршрутизации?
tc ?
...

Дальше платно.
Ответ написан
Комментировать
# sysctl net.ipv4.tcp_syncookies
# sysctl net.ipv4.tcp_max_syn_backlog
# cat /proc/ngix_master_PID/limits
# cat /proc/ngix_worker_PID/limits
Ответ написан
Комментировать
@Nc_Soft
Посмотрите в top статус процессов nginx
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы