落鹤生:前阵子在一个PPC 85xx的板子上出面一个问题,问题现象如下:两个会议终端正常入会,入会后直接将其中一个终端关机(或拔网线),结果导致另一终端的线程一直处于堵塞状态,经查发现该终端的socket(TCP)一直处于FIN_WAIT1的状态,要等到十几分钟之后该socket才能被正常关闭(关于TCP socket关闭的流程及FIN_WAIT1的说明可以参考这篇文章:http://www.rosoo.net/a/201406/16984.html)。
于是一阵子搜Google,有找到很多类似的问题,及所谓的解决方案,但无一能解决该问题,后经Review代码发现该socket被设置为BLOCK模式,最终在将该socket改为NON-BLOCKING模式,并在close该socket之前shutdown收发,即可将该socket的关闭时间缩短到几秒钟,并解决该问题。
大部分是说net.ipv4.tcp_fin_timeout = 10来调节,不管用,狂在百度里谷歌:
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0
一下子搞定,目前还不知道各个参数含义,待查!
全部的sysctl.conf如下:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_tw_buckets = 50000
net.ipv4.tcp_fin_timeout =10
net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
fs.file-max = 65536
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 10240
net.core.netdev_max_backlog = 51200
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0