我们在CentOS 5.9机器上托管了haproxy 1.3.26,它具有2.13 GHz Intel Xeon处理器,作为许多服务的http和tcp负载均衡器,提供~2000请求/秒的峰值吞吐量 . 它已经运行了2年,但逐渐流量和服务数量都在增加 .
我们观察到,即使在重新加载旧的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 . 如果是,那么我们应该担心的是一个数字 . 看What is the cost of many TIME_WAIT on the server side?和Setting TIME_WAIT TCP似乎应该没有任何问题 .
-
如何减少这些TIME_WAIT
-
netstat和lsof有什么替代品,即使TIME_WAIT数量非常多,也会表现良好
1 回答
注意:此答案中的引用全部来自a mail by Willy Tarreau(HAProxy的主要作者)到HAProxy邮件列表 .
TIME_WAIT
状态中的连接是无害的,并且不再消耗任何资源 . 它们由服务器上的内核保留一段时间,以便在连接关闭后仍然收到包的罕见事件 . 在该状态下保持关闭连接的默认时间通常为120秒(或最大段生命周期的2倍)如果您仍希望减少该数字以便更早地释放连接,则可以指示内核执行此操作 . 例如,设置为30秒执行:
如果你有很多连接(无论是否在TIME_WAIT中),
netstat
,lsof
,ipcs
执行得非常糟糕,实际上会降低整个系统的速度 . 再次引用威利:在Debian和Ubuntu系统上,
ss
或iproute2
包中提供了ss
(取决于您的发行版的版本) .