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