随着业务量的增长,业务服务器网络压力不断增大,查看后端服务器网络连接状态,发现TIME_WAIT状态连接巨多,TIME_WAIT 占用大量的连接端口不释放,影响业务服务响应速度。同时大量的每个TCP连接都各自有个数据结构,叫TCP Control Block.Time_wait的时候这个数据结构没有被释放。所以当有太多的TCP连接时,内存可能会被占用很多。
网络密集型后台服务器,网络连接状态:
av.com # av.com
TIME_WAIT 47144 # TIME_WAIT 45920
SYN_SENT 1 # SYN_SENT 1
ESTABLISHED 104 # ESTABLISHED 94
LISTEN 7 # LISTEN 7
av.com # av.com
TIME_WAIT 45670 # TIME_WAIT 48396
ESTABLISHED 102 # ESTABLISHED 99
LISTEN 7 # LISTEN 7
av.com # av.com
TIME_WAIT 45671 # TIME_WAIT 46268
SYN_SENT 2 # ESTABLISHED 100
ESTABLISHED 93 # LISTEN 7
LISTEN 7
超过三四万。这个时候,我们需要修改 linux kernel 的 tcp time wait的时间,有个 可以调整 /etc/sysctl.conf网络控制相关的参数,网上资料很多。
但是修改内核参数效果甚微。经过测试高并发的服务器调整内核参数,我们这边业网络环境,tcp time_wait 能降低%10左右,后期业务压力不断攀升,内核参数优化后的服务器tcp time_wait 会再次爬到一个高点,如上图。
这时该如何解决问题那? 先看一下time_wait 在什么环境下会生成?
TCP结束的过程如下:
Server Client
-------------- FIN --------------> server: fin_wait_1
<------------- ACK --------------- client: close_wait server:fin_wait_2
<------------- FIN --------------- client发出fin之后就关闭
-------------- ACK -------------> server发出ack后进入time_wait状态;
Time_Wait的默认时间是2倍的MLS,MLS(Maximum Segment Lifetime)是TCP片在网上的最长存活时间,它的作用和IP数据包的TTL类似。 主要作用是保证关闭的TCP端口不立即被使用。因为当网络存在延迟时,可能当某个端口被关闭后,网络中还有一些重传的TCP片在发向这个端口,如果这个端口立即建立新的TCP连接,则可能会有影响。所以使用2倍的MSL时间来限制这个端口立即被使用。
查询相关资料,内核中一个宏定义,在 $KERNEL/include/net/tcp.h里面,这个宏是真正控制 TCP TIME_WAIT 状态的超时时间的。内容如下:
#define TCP_TIMEWAIT_LEN (60*HZ)
修改这个宏定义数值设置,根据我们的测试,常用的值有以下三种:30秒,1分钟,2分钟,可以根据业务实际情况进行实测,我们这边网络压力比较大,通过压测最终确定设置为 10 秒,也就是把上面的修改为:
#define TCP_TIMEWAIT_LEN (10*HZ)
然后重新编译内核,重启系统即可发现短连接造成的TIME_WAIT状态倍数级下降,我们实测效果如下:
内核编译升级参考:
http://michaelkang.blog.51cto.com/1553154/1266825
优化系统内核参数主机 │ 内核编译优化主机
av.com (主机名) │av.com (主机名)
TIME_WAIT 46366 │TIME_WAIT 9419
ESTABLISHED 99 │FIN_WAIT1 3
LISTEN 7 │ESTABLISHED 118
av.com │LISTEN 7
TIME_WAIT 46125 │av.com
FIN_WAIT1 1 │TIME_WAIT 8950
SYN_SENT 1 │ESTABLISHED 105
ESTABLISHED 99 │LISTEN 7
LISTEN 7 │av.com
av.com │TIME_WAIT 9668
TIME_WAIT 46591 │ESTABLISHED 114
ESTABLISHED 101 │LISTEN 7
LISTEN 7 │av.com
av.com │TIME_WAIT 9224
TIME_WAIT 44307 │FIN_WAIT1 1
ESTABLISHED 95 │ESTABLISHED 104
LISTEN 7 │LISTEN 7
av.com │av.com
TIME_WAIT 46679 │TIME_WAIT 9763
ESTABLISHED 99 │FIN_WAIT1 2
LISTEN 7 │ESTABLISHED 116
av.com │LISTEN 7
TIME_WAIT 46833 │av.com
SYN_SENT 1 │TIME_WAIT 9173
ESTABLISHED 99 │FIN_WAIT1 1
LISTEN 7 │ESTABLISHED 103
av.com │SYN_RECV 1
TIME_WAIT 45555 │LISTEN 7
SYN_SENT 3 │av.com
ESTABLISHED 104 │TIME_WAIT 9598
LISTEN 7 │ESTABLISHED 117
av.com │LISTEN 7
TIME_WAIT 45214 │av.com
ESTABLISHED 96 │TIME_WAIT 9315
LISTEN 7 │SYN_SENT 1
av.com │ESTABLISHED 106
TIME_WAIT 46498 │LISTEN 7
SYN_SENT 1 │av.com
ESTABLISHED 93 │TIME_WAIT 9524
LISTEN 7 │ESTABLISHED 116
av.com │LISTEN 7
TIME_WAIT 46720 │av.com
SYN_SENT 1 │TIME_WAIT 9110
ESTABLISHED 95 │ESTABLISHED 104
LISTEN 7 │LISTEN 7
同样的网路压力情况下,优化编译后的内核 TIME_WAIT 降低接近5倍,效果很显著。