我正在运行 LAMP 设置,当我使用 netstat 时,似乎有许多 apache2 程序的 CLOSE_WAIT 连接(几百个)。这最终导致我的 apache 变得无响应。
以下是设置:
PHP的:
PHP 5.3.10-1ubuntu3.6 with Suhosin-Patch (cli) (built: Mar 11 2013 14:31:48)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
阿帕奇2:
Server version: Apache/2.2.22 (Ubuntu) [running mpm-prefork]
mysql
Server version: 5.5.29-0ubuntu0.12.04.2-log (Ubuntu)
跑步Ubuntu 12.04 LTS
Linux numerink201 3.2.0-34-virtual #53-Ubuntu SMP Thu Nov 15 11:08:40 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
我有一些问题:
我如何知道我处于流程的哪个阶段?显然,客户端发送了 FIN/RST 请求,但我如何知道是哪个?如果是 FIN,我如何知道该流程是否已发送自己的 FIN/ACK,或者我是否正在等待客户端 ACK。或者是否已收到所有内容但流程未能关闭?
如果是 apache 无法正确关闭进程,我该如何定位问题?
我目前已将 Apache 的超时时间从 300 秒减少到 150 秒,作为临时措施。有没有更好的方法?
提前致谢。
答案1
如果您提供内核版本并告诉我们您使用的是哪个 MPM,这可能会有所帮助。如果是工作(线程)服务器,则切换到 pre-fork(不是因为 Rasmus 在 2005 年说这是个坏主意 - Apache 中也存在问题)。
许多 CLOSE_WAIT 连接
为了哪个服务器?httpd?MySQL?其他的?
显然客户端发送了FIN请求
上次我详细研究这个问题时,发现 MSIE 和 Firefox 通常都使用 RST 而不是“干净”关闭来关闭连接。
您大概并不关心性能,因此禁用 keepalive 可能会有所帮助暂时缓解。