大量time_wait出现的原因?

[TOC]

大量TIME_WAIT出现场景

  在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接这个场景下,会出现大量socket处于TIMEWAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。

大量TIME_WAIT解决方案

应用层面

  尽量避免频繁关闭连接,如业务优化,或者使用长连接等;

系统层面

  1. 缩短MSL时间。
  2. 增加可用端口数量。可用端口数量=单进程可打开的连接数量*机器数量。

危害

作为服务器,短时间内关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,占据大量的tuple /tApl/ ,严重消耗着服务器的资源,此时部分客户端就会显示连接不上

每一个tcp连接关闭后,主动关闭方都会保留这个连接一段时间,这个时间内,这个连接的状态是TIME_WAIT,端口资源不会被释放。

解决方法:

1
2
3
4
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
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 修改系默认的 TIMEOUT 时间

简单来说,就是打开系统的TIMEWAIT重用和快速回收。