Как я должен ограничить медленное отключение тысяч соединений TCP? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть программа golang, работающая на centos, к которой обычно подключено около 5 тыс. Tcp клиентов. Время от времени это число достигает примерно 15k в течение часа, и все же все в порядке.

Программа имеет режим медленного завершения, при котором она прекращает принимать новых клиентов и медленно убивает всех подключенных в данный момент клиентов в течение 20 минут. Во время этих периодов медленного выключения, если на машине 15k клиентов, иногда я получаю:

Wed Oct 31 21:28:23 2018] net_ratelimit: 482 callbacks suppressed
[Wed Oct 31 21:28:23 2018] TCP: too many orphaned sockets
[Wed Oct 31 21:28:23 2018] TCP: too many orphaned sockets
[Wed Oct 31 21:28:23 2018] TCP: too many orphaned sockets

Я попытался добавить:

echo "net.ipv4.tcp_max_syn_backlog=5000" >> /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout=10" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_recycle=1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse=1" >> /etc/sysctl.conf
sysctl -f /etc/sysctl.conf

И эти значения установлены, я вижу их с правильными новыми значениями. Типичный носок:

cat /proc/net/sockstat
sockets: used 31682
TCP: inuse 17286 orphan 5 tw 3874 alloc 31453 mem 15731
UDP: inuse 8 mem 3
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

И идеи, как остановить слишком много ошибок и падений потерянных сокетов? Должен ли я увеличить 20-минутный период медленного отключения до 40 минут? Увеличить tcp_mem? Спасибо!

...