负载均衡SLB后端服务器中TIME_WAIT状态连接数较多

问题描述

负载均衡SLB对后端多台服务器进行负载,且在客户端请求访问量为0的情况下,发现服务器中有大量TIME_WAIT状态的连接。登录后端服务器,执行以下命令,确认TIME_WAIT状态的连接数过多。

while true;do netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}';sleep 1;done | grep TIME_WAIT

系统显示类似如下。

TIME_WAIT 424
TIME_WAIT 430
TIME_WAIT 437
TIME_WAIT 447
TIME_WAIT 455
TIME_WAIT 464
TIME_WAIT 473
TIME_WAIT 481
TIME_WAIT 490
TIME_WAIT 498
TIME_WAIT 506
TIME_WAIT 513

解决方案

说明
  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

这种情况下,有以下两种方法解决问题:

说明

此问题一般出现在SLB的7层(HTTP)转发模式下,在SLB对HTTP请求进行转发时,由于是网络协议中应用层协议的请求,因此在您修改Web应用的超时时间设置、SLB健康检查频率以及系统自身的net.ipv4.tcp_keepalive_time等参数后,对TIME_WAIT状态的连接数目的降低不会有非常明显的效果。

  • 建议您使用SLB的4层(TCP)转发模式,详情请参见添加TCP监听。此模式在每次健康检查时,SLB都会主动通过发送RST状态的数据包断开与服务器的健康检查建立的TCP连接,所以是不会查看到来自SLB健康检查的连接。

  • 除了调整为TCP转发模式,您也可以考虑关闭HTTP转发模式下的健康检查功能,也可以降低TIME_WAIT状态的连接数。但是关闭健康检查后无法监控后端服务器是否存在异常,若SLB转发请求到异常服务器上,会导致访问异常。如何关闭健康检查,请参见关闭健康检查

适用于

  • 负载均衡SLB