因为前些天遇到大量 TIME_WAIT 导致端口耗尽服务异常的情况,让我注意到这个参数。
先说它的作用:在 TIME_WAIT 数量等于 tcp_max_tw_buckets 时,不会有新的 TIME_WAIT 产生。
tcp_max_tw_buckets 应该如何配置
如果不是类似 Nginx 之类的中间代理(即不担心端口耗尽),你通常不用关心这个值,使用官方默认的就好,甚至官方建议在内存大的情况下可以增加这个值。
类似 Nginx 之类的中间代理一定要关注这个值,因为它对你的系统起到一个保护的作用,一旦端口全部被占用,服务就异常了。 tcp_max_tw_buckets 能帮你降低这种情况的发生概率,争取补救时间。
这个值可能有什么不好的影响
在完全下面 3 条完全满足的情况下
- 当前服务器主动关闭连接
- 当前服务器 TIME_WAIT 数等于或大于 tcp_max_tw_buckets
- 对端服务器发完最后一个 Fin 包,没有收到当前服务器返回最后一个 Ack,又重发了 Fin 包
因为新的 TimeWait 没有办法创建 ,这个连接在当前服务器上就消失了,对端服务器将会收到一个 Reset 包。因为这个连接是明确要关闭的,所以收到一个 Reset 也不会有什么大问题。(但是违反了 TCP/IP 协议)
建议
综合收益与成本,以下给出我的建议:
在只有 60000 多个端口可用的情况下,配置为
net.ipv4.tcp_max_tw_buckets = 50000
(在尽可能不违反 TCP/IP 协议的情况下保证系统的可用性)
参考文档
https://yq.aliyun.com/articles/2519?spm=a2c4e.11163080.searchblog.9.77852ec15TOj6z
官方文档: https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
网友评论