我们有一个 haproxy 1.3.26 托管在 CentOS 5.9 机器上,拥有一个 2.13 GHz 的 Intel Xeon 处理器,作为众多服务的 http & tcp 负载均衡器,提供每秒 ~2000 请求的峰值吞吐量。它已经稳定运行了两年,但是流量和服务数量逐渐增加。
最近我们发现即使重新加载,旧的HAProxy进程仍然存在。经过进一步调查,我们发现旧的进程有许多处于TIME_WAIT状态的连接。我们还发现
最近我们发现即使重新加载,旧的HAProxy进程仍然存在。经过进一步调查,我们发现旧的进程有许多处于TIME_WAIT状态的连接。我们还发现
netstat
和lsof
需要很长很长时间。参考http://agiletesting.blogspot.in/2013/07/the-mystery-of-stale-haproxy-processes.html,我们引入了option forceclose
,但它会影响各种监控服务,因此被撤销了。进一步挖掘后,我们意识到在/proc/net/sockstat
中,接近200K个套接字处于tw
(TIME_WAIT
)状态,这令人惊讶,因为在/etc/haproxy/haproxy.cfg
中指定了maxconn
为31000,ulimit-n
为64000。我们将timeout server
和timeout client
从300s
更改为30s
,但没有太大用处。
现在的疑问是:
- 这么多的TIME_WAIT是否可接受?如果是,那么我们应该在哪个数字之后开始担心呢?从服务器端许多TIME_WAIT的代价和设置TIME_WAIT TCP来看,似乎不应该有任何问题。
- 如何减少这些TIME_WAITs
- 是否有任何替代netstat和lsof的方法,即使有很多的TIME_WAITs也能够正常运行?
netstat
和lsof
中提供了-n
,它们会立即响应吗? - David Schwartznetstat -n
的帮助,事实上我一直使用带有-n
选项。 - pseudonym