服务器tcp连接timewait过多优化及详细分析

【背景说明】

在7层负载均衡上,查询网络状态发现timewait太多,于是开始准备优化事宜

整体的拓扑结构,前面是lvs做dr模式的4层负载均衡,后端使用(nginx、or haproxy)做7层负载均衡

【优化效果】

修改前,建立连接的有29个,timewait的就达到了900个,如下图所示

服务器tcp连接timewait过多优化及详细分析

修改后,建立连接的有32个,timewait的从900降低到了49个,如下图所示

服务器tcp连接timewait过多优化及详细分析

【具体优化方案】

注意:前端使用nat时,不适用本策略。详细“方案详细介绍”会说明

修改7层负载所在机器,/etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_timestamps = 1

net.ipv4.tcp_fin_timeout = 20

保存后sysctl -p生效

【方案详细介绍】

net.ipv4.tcp_tw_reuse = 1

#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;该文件表示是否允许重新应用处于TIME-WAIT状态的socket用于新的TCP连接(这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助)

net.ipv4.tcp_tw_recycle = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_timestamps 开启时,net.ipv4.tcp_tw_recycle开启才能生效,原因可以参考以下代码

if (tcp_death_row.sysctl_tw_recycle && tp->rx_opt.ts_recent_stamp)             recycle_ok = icsk->icsk_af_ops->remember_stamp(sk);
if (recycle_ok) {             
                tw->tw_timeout = rto;         
                }
else {          tw->tw_timeout = TCP_TIMEWAIT_LEN;             
                if (state == TCP_TIME_WAIT)                 
                    timeo = TCP_TIMEWAIT_LEN;         
     }

如果服务器身处NAT环境,安全起见,通常要禁止tcp_tw_recycle,如果nat下,开启了tcp_tw_recycle,可能会导致部分用户无法连接服务器的情况:在nat模式下(服务器一般会用到dnat,用户一般会用到snat),nat设备(or服务器)会修改目的ip和源ip,以屏蔽内部信息。试想很多用户snat出来,通过dnat访问网站,在dnat这层,时而会产生时间戳错乱的问题,那么基于tcp的时间戳的tcp_tw_recycle,就会出错。具体可参考

fc1323的扩展的说明

大致意思为:tcp会记录每个连接的时间戳,如果后续时间戳比之前记录的时间戳小,就会认为这是错误的连接,拒绝这个连接。如果tcp_tw_recycle开启,那么这种规则就会被激活(那样才能快速回收连接)。所以在lvs使用nat的情况下,用户请求到lvs,LVS会修改地址数据后将请求转发给后端服务器,但不会修改时间戳(因为nat的机制就是只修改源地址和目的地址)。在后端服务器看来,请求的源地址永远都是LVS的地址,并且端口复用,原本不同客户端的请求经过LVS的转发,就可能会被认为是同一个连接,加之不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象。就会出现部分用户能连接服务器,部分用户不能连接服务器的情况。

但在LVS使用用dr模式情况下,lvs只会修改mac和ip地址的映射关系,后端服务器看到的还是不通的用户ip,所以激活这一规则,也不会有问题。我们这里能使用这个策略,最大的原因也是在这里

net.ipv4.tcp_timestamps = 1

#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout = 15;这个参数是用来设置保持在FIN_WAIT_2状态的时间。tcp4此挥手,正常的处理流程就是在FIN_WAIT_2情况下接收到FIN进入到TIME_WAIT的情况,tcp_fin_timeout参数对处于TIME_WAIT状态的时间没有任何影响。但是如果这个参数设的比较小,会缩短从FIN_WAIT_2到TIME_WAIT的时间,从而使连接更早地进入TIME_WAIT状态。状态开始的早,等待相同的时间,结束的也早,客观上也加速了TIME_WAIT状态套接字的清理速度。 

tcp连接的断开,可参考以下状态机:

服务器tcp连接timewait过多优化及详细分析

【补充说明】

如果变更后运行命令netstat -s|grep timestamp

发现packets rejects in established connections because of timestamp

数值增加的很快,你可能得回滚这个变更了:说明使用snat访问你网站的人很多

因为:虽然服务器端没有使用nat,但是客户端使用snat的情况很多,如果后发现packets rejects in established connections because of timestamp增长很快,建议将这个方案回滚。那时,可使用修改net.ipv4.tcp_max_tw_buckets(centos默认似乎是 262144)可调整至100000。其实也说明,timeout数量不大的时候,其实可以不用调整tcp_tw_recycle参数(风险很大)。

wKiom1Ty5J6j_VO0AACyl62w9hk303.jpg

【总结】

一个小小的变更,背后涉及的知识是异常多的,所以需要

     1、不能随意找个方案就使用,需要深入理解。就像说这个A药可以治疗B症状,但是本质是A药可以治疗C病因情况下得B症状,需要把病因搞清楚了再吃药。就算侥幸治疗好了,也不能永远都是报这种侥幸心理。

     2、对于内核参数调整,需要对每个参数都了解之后再行动,否则可能会有悲剧。

     3、变更的时候,需要有一个灰度过程,需要观察一段时间后,再大面积修改。

更多相关文章
  • 今天冯同学遇到个问题,tcp连接的close_wite过多.解决办法:(1)修改文件描述符(2)修改内核参数(3)需要重启网络(不重启的话上面修改的可能会不起作用)所有文章都没有要重启网络的问题,这也是刚才告诉我的.给我的一篇参考文章:http://blog.sina.com.cn/s/blog_4 ...
  • 原文地址:http://www.cnblogs.com/coser/archive/2010/12/05/1968812.html 一.实验目的 实验1_1: 使用Freebsd/Linux操作系统下的C编译器和网络程序的调试方法,掌握TCP连接建立和终止以及调整缓冲区大小的方法. 实验1_2: 使 ...
  • 注:熟练掌握TCP/IP 各连接与中断流程,及状态变化;有利网络设置与系统内核TCP连接参数的优化.TCP正常建立和关闭的状态变化TCP连接的建立可以简单的称为三次握手,而连接的中止则可以叫做 四次握手.建立连接在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手 ...
  • 这个问题在网上已经有很多人讨论过了,再谈这个问题,只是根据我处理过的相关业务来谈谈我的看法.至于什么是TIMEWAIT,我想,并不需要多说.TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的.仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这 ...
  • Linux配置支持高并发TCP连接(socket最大连接数)1.修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄, ...
  • 新Apache服务器上线以后,用netstat -an命令发现服务器中有大量状态为TIME-WAIT的TCP连接,于是用/sbin/sysctl -a查看了一下Linux的各项内核参数,并翻阅有关资料,决定修改其中的两项参数,以达到减少TCP连接中TIME-WAIT sockets的目的.vi /e ...
  •      随着业务量的增长,业务服务器网络压力不断增大,查看后端服务器网络连接状态,发现TIME_WAIT状态连接巨多,TIME_WAIT 占用大量的连接端口不释放,影响业务服务响应速度.同时大量的每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数 ...
  • 昨天2台Windows Server 2012服务器出现奇怪的问题,自己竟然连不上自己的本机80端口,telnet 127.0.0.1 80也连不上,而更奇怪的是其它服务器可以连接到这2台服务器的80端口.在这2台服务器上,浏览器打不开任何网站,但能ping通.重启其中1台服务器后,被重启的服务器恢 ...
一周排行
  • 系统运维篇之DellR720-配置Broadcom网卡组配置实例
    首先,配置端口组在实际情况中的运用的场景很多,偏冗余主要为了解决单点故障问题.多是配合在H ...
  • 一.简介:LINUX下实现FTP服务的软件很多,最常见的有vsftpd,Wu-ftpd和Proftp等访问FTP服务器时需要经过验证,只有经过了FTP服务器的相关验证,用户才能访问和传输文件.vsftpd提供了3种f ...
  •  11年,终结了向家里要钱的历史.可以养活自己了,很庆幸.工作一周了,每天都有不同的感受.不知道会是我去改变工作,还是工作会改变我,期待时间的验证...
  • mysql如何添加用户  1.语句如下:use mysql;2.在mysql的user表中增加连接用户帐号:这里不要直接使用INSERT语句添加user记录,使用INSERT可能出现:ERROR 1364 (HY00 ...
  • 2010年下半年网络工程师考试上午试卷与参考答案2
    全国计算机技术与软件专业技术资格(水平)考试2010年下半年 网络工程师 上午试卷参考答案 ...
  • cocos2d-x学习笔记16:记录存储1:CCUserDefault
     CCUserDefault一.简述CCUserDefalt作为NSUserDefalt类 ...
  • 无锡新区检察院检察长苟小军(居中)2012年4月22日,无锡新区检察院检察长苟小军一行到永中软件视察指导工作.苟小军检察长在了解了永中软件产品线.专利发明等几个方面取得了可喜的成绩后,深有感触地说,“为了帮助无锡新区 ...
  • [一]何为可变性可变性是.NET4.0中的一个新特性,可变性可分为 : 协变性.逆变性.不可变性.那么在.NET4.0之前是否有可变性? 答案是肯定的,我们可以通过下面的几个实例来简单的了解一下.NET4.0之前的协 ...
  • Note3港版稳定ROM刷机
    对应机型机型:N900(猎户座5420 CPU的版本),高通机型勿刷!Android版本: ...
  • 一个集合,里面有年和月的属性,按照年和月进行分组显示数据 var groupByYearMonth = _.chain(topics).groupBy(function (item) { return item.To ...