我有一个在centos上运行的golang程序,该程序通常已连接约5k tcp客户端。有时,这个数字有时会达到1万5千左右,仍然一切正常。
程序具有慢速关机模式,在该模式下,它将停止接受新客户端,并在20分钟的过程中缓慢杀死所有当前连接的客户端。在这些缓慢的关机期间,如果计算机有15,000个客户端,有时我会得到:
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
这些值已设置,我看到了它们的正确新值。典型的sockstat是:
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?谢谢!