分享

TCP Socket一直处于FIN

 中间件 2020-08-03

落鹤生:前阵子在一个PPC 85xx的板子上出面一个问题,问题现象如下:两个会议终端正常入会,入会后直接将其中一个终端关机(或拔网线),结果导致另一终端的线程一直处于堵塞状态,经查发现该终端的socket(TCP)一直处于FIN_WAIT1的状态,要等到十几分钟之后该socket才能被正常关闭(关于TCP socket关闭的流程及FIN_WAIT1的说明可以参考这篇文章:http://www./a/201406/16984.html)。

于是一阵子搜Google,有找到很多类似的问题,及所谓的解决方案,但无一能解决该问题,后经Review代码发现该socket被设置为BLOCK模式,最终在将该socket改为NON-BLOCKING模式,并在close该socket之前shutdown收发,即可将该socket的关闭时间缩短到几秒钟,并解决该问题。

以下为之前搜到的一个不正确的答案,但也可作为一个参考,故予以保留。

-----------------------------

fin_wait1过多问题

大部分是说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

 

(落鹤生)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多