1)新建连接失败。
TIME_WAIT 到 CLOSED,需要 2MSL=60s 的时间。这个时间非常长。每个连接在业务结束之后,需要60s的时间才能完全释放。如果业务上采用的是短连接的方式,会导致非常多的TIME_WAIT状态的连接,会占用一些资源,主要是本地端口资源。
一台服务器的本地可用端口是有限的,也就几万个端口,由这个参数控制:
sysctl net.ipv4.ip_local_port_range
当服务器存在非常多的 TIME_WAIT 连接,将本地端口都占用了,就不能主动发起新的连接去连其他服务器了。
这里需要注意,是主动发起连接,又是主动发起关闭的一方才会遇到这个问题。
如果是 server 端主动关闭 client 端建立的连接产生了大量的 TIME_WAIT 连接,这是不会出现这个问题的。除非是其中涉及到的某个客户端的 TIME_WAIT连接都有好几万个了。
2)TIME_WAIT 条目超出限制。
这个限制,是由一个内核参数控制的:
sysctl net.ipv4.tcp_max_tw_buckets
超出了这个限制会报一条 INFO 级别的内核日志,然后继续关闭掉连接。并没有什么特别大的影响,只是增加了刚才提到的收到脏数据的风险而已。
另外的风险就是,关闭掉 TIME_WAIT 连接后,刚刚发出的 ACK 如果对端没有收到,重发FIN包出来时,不能正确回复ACK,只是回复一个RST包,导致对端程序报错,说 connection reset。
因此 net.ipv4.tcp_max_tw_buckets 这个参数是建议不要改小的,改小会带来风险,没有什么收益,只是表面上通过netstat看到的TIME_WAIT少了些而已,有啥用呢?
并且,建议是当遇到条目不够,增加这个值,仅仅是浪费一点点内存而已。
资料来源:电子书《ECS运维指南之Linux系统诊断》,下载链接:https://developer.aliyun.com/topic/download?id=143
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。