启用参数tcp_tw_recycle导致丢包现象

Published: Tags: LINUX

千万不要在生产环境中打开tcp_tw_recycle内核参数!因此而引起的BUG极其难定位,随机偶发,时间不定。 前后历经了近几个月的时间,最后在腾讯云技术同学的帮忙下,才找到原因,当时的情况是这样:

我们像往常一样按操作文档部署运行环境,但是最近的几个项目在公司的网络下,偶尔出现无法访问的情况。 手机连WIFI无法打开,服务器SSH连接不上,端口80抽风(过会刷新又正常),在当前项目出现的频率更高。

开始以为是错觉,可能只是因为当前项目操作得多所以感觉出错频率高。而在同一时间下,使用4G是正常的。 在家里的网络下访问也是没问题的,初步怀疑是我们公司内网的原因,但没有具体的场景因此无法排除猜想。

当我们把公司的网络整体重置仍然没有好转后,我们开始怀疑运营商和腾讯云(主要是这两者最近经常抽风) 但在打了日志后发现问题只出在我们自己的项目上,公司访问其他网站或其他旧项目并没有如此高的出错率。

这时又想是否我们哪些操作触发了GFW的反应,因为这现象和被墙实在太像,但SSH都会失败,这就不得解了。 最后在极其巧合的情况下,终于用tcpdump在服务异常时抓到了数据包(之前一直抓不到,所以绕了这么久) 既然能在服务器上抓到包,就证明了这链路是正常只是没有正常的响应,这就表明了是我们的环境有问题了。

最终定位到是tcp_tw_recycle参数被打开导致,以前埋的坑,因为最近上小游戏平台,要经常调试才引出来。

出现异常的条件有三个: 1、打开了tcp_tw_recycle内核参数,并且打开了tcp_timestamps参数(默认开启) 2、终端的网络是在NAT之下(所以使用4G正常,而家里没遇到则是因为以下第三条) 3、在NAT下的设备多且时间异常多了,则更容易遇到(因为公司内网机器多,且经常改时间测试)

原因参考以下资料: 记一次TIME_WAIT网络故障 不要在linux上启用net.ipv4.tcp_tw_recycle参数 Coping with the TCP TIME-WAIT state on busy Linux servers