net.ipv4.tcp_tw_recycle导致的请求超时

背景:线上环境登录页,大量请求超时无响应。检查网正常,服务器CPU,内存等参数也都正常。

参考:https://www.jianshu.com/p/893b5d7e9f30

原因:服务器启用了net.ipv4.tcp_tw_recycle机制

当开启了tcp_tw_recycle选项后,当连接进入TIME_WAIT状态后,会记录对应远端主机最后到达分节的时间戳。如果同样的主机有新的分节到达,且时间戳小于之前记录的时间戳,即视为无效,相应的数据包会被丢弃;

一个公网IP(经过NAT)大量地去反问服务器,不同客户端的时间可能不一致,所以就会出现时间戳错乱的现象,于是后面的数据包就被丢弃了,具体的表现通常是是客户端明明发送的SYN,但服务端就是不响应ACK,还可以通过下面命令来确认数据包不断被丢弃的现象;

  • 查看主机TCP连接数
  • netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

解决:

net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 0

猜你喜欢

转载自www.cnblogs.com/wanhua-wu/p/10130276.html