TCP连接TIME-WAIT

在性能测试中遇到nginx返回502错误,原因是大量HTTP请求导致服务器端口耗尽。问题出在TCP连接的TIME-WAIT状态没有被快速回收。通过设置`net.ipv4.tcp_timestamps=1`和`net.ipv4.tcp_tw_recycle=1`可以加速回收,但在NAT环境下启用`tcp_tw_recycle`会导致时间戳混乱,从而断开正常连接。在NAT设备如LVS的负载均衡场景中,端口复用和时间戳错乱可能导致数据包丢失,影响连接稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用nginx做负载均衡做性能测试的时候,发现nginx会抛出502错误,Cannot assign requested address,目标server端口号被占用光,其实是因为大量http请求短时间内快速连接、释放导致的,因为服务器默认没有开启tcp TIME-WAIT快速回收。


如下是一系列相关linux参数设置:
cat /proc/sys/net/ipv4/ip_local_port_range      32768   61000
cat /proc/sys/net/ipv4/tcp_max_syn_backlog      1024
cat /proc/sys/net/ipv4/tcp_syn_retries          5
cat /proc/sys/net/ipv4/tcp_max_tw_buckets       180000
cat /proc/sys/net/ipv4/tcp_tw_recycle           0

cat /proc/sys/net/ipv4/tcp_tw_reuse             0


设置方法:sysctl -w net.ipv4.tcp_timestamps=1 
ip_local_port_range目标服务器支持的tpc端口后范围,可以设置大一点
tcp_max_tw_buckets同时处于TIME-WAIT的tcp最大连接数
tcp_timestamps 是否开启tcp TIME-WAIT时间戳记录,默认开启,1

tcp_tw_recycle是否快速回收,1是开启


通常需要设置

sysctl -w net.ipv4.tcp_timestamps=1 

sysctl -w net.ipv4.tcp_tw_recycle=1

这样nginx发起的大量http请求会被快速回收


但是要注意一点,在nat环境下不能设置net.ipv4.tcp_tw_recycle=1,因为时间戳混乱会造成正常请求被切断

在nat模式下(服务器一般会用到dnat,用户一般会用到snat),nat设备(or服务器)会修改目的ip和源ip,以屏蔽内部信息。试想很多用户snat出来,通过dnat访问网站,在dnat这层,时而会产生时间戳错乱的问题,那么基于tcp的时间戳的tcp_tw_recycle,就会出错

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值