专栏首页johnnyxsu技术交流分享玩转CVM之tw_reuse和tw_recycle 罪与罚
原创

玩转CVM之tw_reuse和tw_recycle 罪与罚

在使用腾讯云环境中,经常会遇到如下几种比较诡异的情况:

1.CVM ping测试正常,但使用TCP连接,偶尔出现超时或延时较大,而此时网络并没有发生抖动。

2.CLB+CVM架构经常会出现CLB检测到部分RS健康检查异常,但自己测试的时候发现RS正常服务。

3.用户访问CLB会出现504情况,查看日志发现是RS返回,而RS健康检查和测试都正常。

本文将针对上述出现场景提供一个解决思路。

Linux TIME_WAIT 主要有三个相关参数:

net.ipv4.tcp_tw_reuse = 1    表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭
net.ipv4.tcp_tw_recycle = 1  表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_fin_timeout = 60  表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间

国外的一篇英文文档详细介绍了TCP TIME-WAIT 相关内容,题为《Coping with the TCP TIME-WAIT state on busy Linux servers》 有兴趣的同学可以移步参考。

net.ipv4.tcp_tw_reuse

TIME-WAIT状态是为了防止不相关的延迟请求包被接收。但在某些特定条件下,很有可能出现,新建立的TCP连接请求包,被旧的连接(同样的四元组,暂时还是TIME-WAIT状态,回收中)误处理。RFC 1323 实现了TCP扩展,以提高高带宽链路的性能。除此之外,它还定义了一个带有两个四字节时间戳字段的新TCP选项,第一个字节是TCP发送方的当前时钟时间戳,而第二个字节是从远程主机接收到的最新时间戳。启用net.ipv4.tcp_tw_reuse后,如果新的时间戳,比以前存储的时间戳更大,那么linux将会从TIME-WAIT状态的存活连接中,选取一个,重新分配给新的连接出去的TCP连接。此时处在TIME-WAIT状态连接,仅仅1秒后就可以被重用了。

作为客户端因为有端口65535限制的问题,TIME-WAIT状态的连接过多直接影响处理能力,打开tw_reuse 即可解决该问题。同时不建议打开tw_recycle,没有任何作用。net.ipv4.tcp_tw_reuse参数能够帮助客户端1s完成TCP连接的快速回收,此时单机就可实现6w/s的极限请求,如果还需要再增加连接数此时就需要增加IP数量来提高连接数。

net.ipv4.tcp_tw_recycle

TCP快速回收是一种链接资源快速回收和重用的机制,当TCP链接进入到TIME_WAIT状态时,通常需要等待2MSL的时长,但是一旦启用TCP快速回收,则只需等待一个重传时间(RTO)后就能够快速的释放这个链接,以被重新使用。

在一些高并发的网站服务器上,为了端口能够快速回收,打开了net.ipv4.tcp_tw_recycle。net.ipv4.tcp_tw_recycle禁用时,kernal 是不会检查对端机器的包的时间戳。但启用net.ipv4.tcp_tw_recycle后,kernel就会检查时间戳,如果发来的包的时间戳是乱跳的,就会出现把带了“倒退”的时间戳的包当作是recycle的tw连接的重传数据,不是新的请求,于是丢掉不回包,造成大量丢包。

当多个客户端处于同一个NAT环境时,同时访问服务器,不同客户端的时间可能不一致,此时服务端接收到同一个NAT发送的请求,就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK。在服务器借助下面的命令可以来确认数据包是否有不断被丢弃的现象。

netstat -s | grep rejects

下面我们来具体说下,首先解释下TCP的TIME_WAIT状态:

1)通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。比如,客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间,进入CLOSED状态。TIME_WAIT状态的作用是为了保证连接正常关闭,且不影响其他新建的链接。

TCP断开过程

2) 开启net.ipv4.tcp_tw_recycle的目的,就是希望能够加快TIME_WAIT状态的回收,当然这个选项的生效也依赖于net.ipv4.tcp_timestamps的开启(缺省就是开启的)。当开启了net.ipv4.tcp_tw_recycle选项后,当连接进入TIME_WAIT状态后,会记录对应远端主机最后到达分节的时间戳。如果同样的主机有新的分节到达,且时间戳小于之前记录的时间戳,即视为无效,相应的数据包会被丢弃。

3) 当客户终端经过NAT代理时,客户端TCP请求到达NAT网关,修改目的地址(IP+端口号)后便转发给后端服务器,而客户端时间戳数据没有变化。对于后端Web Server,请求的源地址是NAT网关,所以从后端服务器的角度看,原本不同客户端的请求经过NAT的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了。

注:重新修改回该值的初始值必须在/etc/sysctl.conf中修改net.ipv4.tcp_tw_recycle = 0 然后再执行命令:sysctl -p之后才能生效。

总结

最合适的解决方案是增加更多的四元组数目,比如,服务器可用端口,或服务器IP,让服务器能容纳足够多的TIME-WAIT状态连接。在我们常见的互联网架构中(NGINX反代跟NGINX,NGINX跟FPM,FPM跟redis、mysql、memcache等),减少TIME-WAIT状态的TCP连接,最有效的是使用长连接,不要用短连接,尤其是负载均衡跟web服务器之间。

在服务端,不要启用net.ipv4.tcp_tw_recycle,除非能确保你的服务器网络环境不是NAT。在服务端上启用net.ipv4.tw_reuse对于连接进来的TCP连接来说,并没有任何用处。

在客户端上启用net.ipv4.tcp_tw_reuse,还算稍微安全的解决TIME-WAIT的方案。再开启net.ipv4.tcp_tw_recycle的话,对客户端(或以客户端形式)的回收,也没有什么用处,反而会发生很多诡异的事情(尤其是FPM这种服务器上,相对nginx是服务端,相对redis是客户端)。

可以使用如下命令查看当前主机的链接状态统计: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • CLB健康检查异常排查流程

    CLB健康检查是指负载均衡实例定期向后端服务器发送 Ping、尝试连接或发送请求来测试后端服务器运行的状况。当后端服务器实例被判定为不健康时,负载均衡实例将不会...

    苏欣
  • 张明楷:非法获取虚拟财产的行为性质

    张明楷  清华大学法学院教授、博士生导师 编者按:原文已发表于2015年第3期的《法学》。因受篇幅限制,经作者及出版杂志社的同意,本文略有删减。 内容摘要 ...

    腾讯研究院
  • 信安 | 红包踩雷,为什么输的总是你?

    有网友在腾讯举报中心公众号留言——“我在微信群里玩抢红包游戏,莫名其妙被举报为赌博,究竟是为啥?” 小助手:Excuse me ?这位网友,你确定你真的只是单纯...

    腾讯技术工程官方号
  • 《刑法修正案(九)》:对网络黑产伸出重拳

    2015年8月29日下午,第十二届人大常务委员会通过了刑法修正案(九),全称《中华人民共和国刑法修正案(九)》,自11月1日起正式施行。 关于执行刑法确定罪名的...

    FB客服
  • 早报:新华社批作业帮等App涉黄 网上课堂成“污秽温床”?

    1、 新华社:作业帮等APP涉黄,网上课堂咋成污秽温床 近期,部分网民反映,一些面向中小学生的学习类APP竟暗藏“小黄文”“荤段子”。记者调查发现,此类APP...

    用户1335017
  • 用TC优化腾讯云Linux服务器QOS软限速导致的断流

    关键词:QOS 限速 惩罚机制 断流 腾讯云 轻量 Youtube卡顿 tc 流量控制 技术 随笔

    用户4693001
  • 今天,请为儿童发声,一起抵制儿童色情

    “不就是拍点儿童没穿衣服的搞笑的视频和照片吗?孩子都还小,哪儿有什么性别之分,没那么严重。”——某家长

    腾讯举报中心
  • 网络不良言论在各国被关注情况一览

    1本周热点话题:网络不良言论备受各国关注 I. 网络涉军违法犯罪和不良信息举报平台正式上线运行 为深入贯彻落实党的十九大精神,充分发挥广大人民群众的参与监督作用...

    安恒信息
  • 谁动了我的个人信息?

    今年5月,全国首例“撞库打码”案宣判,立即引起了社会的广泛讨论。人们不禁要问,我的个人信息是如何泄露的?信息泄露对我们的生活又会造成哪些影响?本期,小助手带领大...

    腾讯举报中心
  • 苹果华人工程师被捕后续,按“商业间谍”指控,本人不认罪

    量子位
  • 银行内鬼程序员曝光:服务器植病毒,ATM取款717万,账户余额还不变

    现在,有个程序员实现了。通过往总行服务器植入病毒,每天ATM取款5千至2万,一年多内取走700多万,而且银行卡余额始终没有变化。

    量子位
  • 极客周刊丨国产勒索病毒来袭,高校AI战胜律师团,DDoS事件刷历史记录...

    一川水巷
  • 公安部:公安机关互联网安全监督检查规定

    《公安机关互联网安全监督检查规定》已经2018年9月5日公安部部长办公会议通过,现予发布,自2018年11月1日起施行。

    C4rpeDime
  • 【玩转腾讯云】五.手把手教你用VNC搭建Ubuntu可视化界面(一)

    ②选择自定义配置——计费模式为“按量付费”——地域选择“北京”——可用区选择“随机可用区”——网络选择“默认”即可

    一只特立独行的兔先生
  • 美打压国产芯片再出新招!拟逮捕福建晋华前总裁陈正坤等人

    据彭博社6月26日报道,美国旧金山法院在当地时间6月24日发出逮捕令,将涉嫌窃取美国存储大厂位于爱达荷州的美光DRAM技术商业机密的三位嫌疑人列入通缉名单。

    新智元
  • 【玩转腾讯云】征文活动获奖名单公布

    由云+社区联合腾讯云免费体验馆及各产品团队举办【玩转腾讯云】征文活动,吸引入驻作者积极参加,非常感谢各位作者的参与。经过评委老师从产品创新性、实用性、可借鉴性、...

    云加社区
  • 云计算时代个人信息保护的法律规制

    全球席卷“云”浪潮,云计算时代的到来加速了信息流动,使人们能够通过各种类型的互联网终端获取自己所需要的大量信息,极大地提高了信息资源的获取率和利用率。然而,云计...

    静一
  • 你的爬虫会送你进监狱吗?

    随着大数据的火热,数据相关行业竞争不仅“蒸蒸日上”,爬虫之间的战争也越发地激烈。一篇《你的爬虫会送老板进监狱吗?》在程序猿圈子里被大量转载,甚至有的程序员因为非...

    崔庆才
  • 怎么去爱各个年龄阶段的孩子

    一个孩子0-18岁的成长历程分三个不同阶段,在三个不同阶段父母扮演应不同的角色。

    用户1756920

扫码关注云+社区

领取腾讯云代金券