Linux服务器进行性能优化中,如何解 TIME_WAIT 问题?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
您好,TCP 状态迁移过程中可以看到,主动关闭的一方会进入 TIME_WAIT 状态(而被动关闭的一方会进入 CLOSE_WAIT 状态)。TIME_WAIT 状态保持的时间为 2MSL,即 60 秒。TIME_WAIT 状态之所以存在是为了解决网络中的异常问题,比如
网络存在延迟和重传,前一个连接的延迟数据包可能被新的连接错误接收。
关闭连接时最后的 ACK 可能会丢失重传,这会干扰新的连接(即重复发送的 FIN 包会关闭新的连接)。
TIME_WAIT 连接数量多了以后,会导致三个危害:
占用内存
占用端口号
占用连接跟踪表
解决方法
增大 net.ipv4.tcp_max_tw_buckets 和 net.netfilter.nf_conntrack_max。
减小 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait ,让系统尽快释放资源。
开启端口复用 net.ipv4.tcp_tw_reuse。这样,被 TIME_WAIT 状态占用的端口,还能用到新建的连接中。
增大本地端口的范围 net.ipv4.ip_local_port_range 。
增加最大文件描述符的数量。你可以使用 fs.nr_open 和 fs.file-max。