tcp_tw_reuse 和 tcp_tw_recycle 在特定环境中不起作用

tcp_tw_reuse 和 tcp_tw_recycle 在特定环境中不起作用

我们正在运行 HAProxy,将 mysql 流量从 PHP 引导到一组 mysql 服务器。但是,由于 mysql-client 发送 TCP 数据包的方式存在问题,我们在时间的等待并发端口利用率达到 50k+,最终由于极重负载下的端口耗尽,HAProxy 上会出现 SOCKERR 消息,如下所述 -http://blog.haproxy.com/2012/12/12/haproxy-high-mysql-request-rate-and-tcp-source-port-exhaustion/

上述文章建议启用tcp_tw_reusetcp_tw_recycle在 HAProxy 服务器上,我们已经在一个测试环境中进行了此操作,这实际上解决了我们的问题,并在高负载下将 TIME_WAIT 连接数保持在 1000 以下。但是,对于我们在另一个环境中启用这两个 TCP 设置,情况并非如此 - TIME_WAIT 仍然很高,端口利用率仍然超过 50k。

两个环境都使用相同的内核和相同的 haproxy 版本,我们无法确定是什么原因导致这个特定的环境不接受tcp_tw_reusetcp_tw_recycle变化。

在两种环境中,我们将 port_range 扩展为1024-65535。这是在 CentOS 6.4 上。

请帮忙——我们正忙得不可开交,如果你需要更多信息,我可以提供。谢谢。

答案1

找到根本原因。必须在本地服务器以及您尝试访问的任何出站服务器上启用 tcp_timestamps。tcp_tw_reuse 和 tcp_tw_recycle 依赖于 tcp_timestamps 来确定要重用哪些端口。请参阅此内容 -http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html

相关内容