07 Feb 2017
TIME_WAIT是TCP连接中的一个状态,每一个TCP连接都会在内存中维护一个控制块TCB(Transmission Control Block),用来记录TCP连接的IP和端口等信息。TIME_WAIT状态会维持一小段时间(最大分段使用期的2倍,2MSL),以确保这段时间内不会有相同的IP和端口号的新连接,目的是为了预防,上一个连接的分组包延迟到达,而被新的连接接受而导致TCP流被破坏。
但是处于TIME_WAIT状态的TCP连接过多也会造成性能问题,比如我们的可用源端口只有60000个,而在2MSL(Maximum Segment Lifetime, 时间根据不同系统不一样,大概2分钟左右)内是无法被重用的,也就是说我们的tcp连接率就限制在了在60000/120 = 500次/秒。
即使没有遇到端口耗尽的问题,在有大量TCP连接及TCB占用内存比例过大时,也会严重影响系统的性能。
因为每一个tcp连接是由
# 查看可用端口数目 cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 # TIME_WAIT状态tcp存活时间,默认是2倍的MSL,在linux内核源码中,这个值是个常量TCP_TIMEWAIT_LEN=60s,是不可以改变的。 # 计算tcp并发数 echo "(60999-32768)/60"|bc 470
根据上面的tcp并发算法能看出来,针对于同一个服务端口,tcp并发随着可用的端口范围的增加而增加。
所谓tcp连接,是由
vim /etc/sysctl.conf *************************************** # 启用tcp的时间戳配置,只有启用这个,下面reuse和recycle才生效。 net.ipv4.tcp_timestamps = 1 # 允许TIME_WAIT SOCKETS重新用于新的TCP连接,依赖开启tcp优化中的tcp_timestamp # tcp_tw_reuse - INTEGER # Enable reuse of TIME-WAIT sockets for new connections when it is # safe from protocol viewpoint. # 0 - disable # 1 - global enable # 2 - enable for loopback traffic only # It should not be changed without advice/request of technical # experts. # Default: 2 net.ipv4.tcp_tw_reuse = 1 # !!!网上很多人转载这个,但是这个配置不要用于nat网络里面,详情可以自己谷歌此配置和nat关键字!!! # 开启TCP连接中的TIME_WAIT SOCKETS快速回收,依赖开启tcp优化中的tcp_timestamp net.ipv4.tcp_tw_recycle = 1 # !!!nat网络下不建议开!!! # 修改FIN_WAIT2状态tcp的超时时间为30s,默认等于TCP_TIMEWAIT_LEN,是60s # tcp_fin_timeout - INTEGER # The length of time an orphaned (no longer referenced by any # application) connection will remain in the FIN_WAIT_2 state # before it is aborted at the local end. While a perfectly # valid "receive only" state for an un-orphaned connection, an # orphaned connection in FIN_WAIT_2 state could otherwise wait # forever for the remote to close its end of the connection. # Cf. tcp_max_orphans # Default: 60 seconds net.ipv4.tcp_fin_timeout = 30 *************************************** # 使配置立即生效 sysctl -p