每日一问 如何解决 time_wait 过多?

lework · 2020年08月07日 · 30 次阅读

TIME_WAIT 状态是出现在主动发起连接关闭的一点,从 TIME_WAIT 状态到 CLOSED 状态有个超时时间为 2*MSL

  1. 最佳方式,短链接改为长连接方式
  2. 治标不治本的方式
net.ipv4.tcp_tw_recycle = 0 关掉快速回收
net.ipv4.tcp_tw_reuse = 1 开启tw 状态的端口复用(客户端角色)
net.ipv4.tcp_timestamps = 1 复用需要timestamp 校验为1
net.ipv4.tcp_max_tw_buckets = 30000 放大bucket
net.ipv4.ip_local_port_range = 15000 65000 放大本地端口范围
net.ipv4.tcp_fin_timeout = 15  缩短超时时间

tw 满了会怎么样?

出现信息:TCP: time wait bucket table overflow。

  • 新内核:tw_bucket 满了的话,会影响 established 状态的连接在 finack 的时候,直接进入 closed 状态。
  • 老内核:tw_bucket 满了的话,会将 tw_bucket 里面的 time_wait 按照一定的规则(如 LRU),将一批 time_Wait 直接进入 closed 状态 ,然后 established 状态发送 finack 后进入 time_wait。

tw 的开销是什么?

  1. 特别少量的内存。
  2. 占用本地端口。

关于 close_wait

CLOSE_WAIT 的状态是 服务器端/ 客户端程序收到外部过来的 FIN 之后,响应了 ACK 包,之后就进入了 CLOSE_WAIT 状态。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册