我正在寻找关于应该在哪里深入挖掘的建议。
很快,Apache2 服务器在启动 2-15 小时后就会停止处理请求。结果我不得不花上service apache2 restart
半天时间做这件事。
长版本:
- 我正在专用服务器(Ubuntu 13.04)上运行一些网站(Apache 2.2.22 构建于 2013 年 7 月 12 日)。
- Apache2 服务器已经运行良好半年多了,现在突然停止处理所有网站(大约 5 个网站)上的请求,直到 apache 进程重新启动。
- 我在 /var/log/apache 中找不到与该问题有关的任何异常日志。
service apache2 status
报告该进程正在运行
很高兴听到您的建议,以及我该如何处理我的情况。
更新:
跑步netstat -an | grep 80
:
tcp6 0 0 :::80 :::* LISTEN
tcp6 325 0 SERV_IP:80 IP_A:35514 CLOSE_WAIT
tcp6 332 0 SERV_IP:80 IP_B:34198 CLOSE_WAIT
tcp6 379 0 SERV_IP:80 IP_C:57859 CLOSE_WAIT
tcp6 0 0 SERV_IP:80 IP_A:35060 CLOSE_WAIT
tcp6 360 0 SERV_IP:80 IP_A:38481 CLOSE_WAIT
tcp6 466 0 SERV_IP:80 IP_B:56324 CLOSE_WAIT
tcp6 361 0 SERV_IP:80 IP_A:53466 CLOSE_WAIT
tcp6 1 0 SERV_IP:80 IP_A:38102 CLOSE_WAIT
tcp6 196 0 SERV_IP:80 IP_E:58125 ESTABLISHED
还有更多类似的条目,大约有 150 条。
ps aux | grep apache
:
root 2968 0.0 0.0 452240 21116 ? Ss 16:08 0:01 /usr/sbin/apache2 -k start
www-data 5217 0.0 0.0 463584 23820 ? S 17:04 0:03 /usr/sbin/apache2 -k start
后面的行(www-data)大约有 120 行,因此我假设有 120 个 apache 进程?
strafe
在 apache2 root 进程上使用:
sudo strace -f -p 2968
Process 2968 attached - interrupt to quit
select(0, NULL, NULL, NULL, {0, 264394}) = 0 (Timeout)
wait4(-1, 0x7fff6d157a6c, WNOHANG|WSTOPPED, NULL) = 0
select(0, NULL, NULL, NULL, {1, 0}) = 0 (Timeout)
wait4(-1, 0x7fff6d157a6c, WNOHANG|WSTOPPED, NULL) = 0
在其中一个 www-data 进程上使用:
sudo strace -f -p 8554
Process 8554 attached - interrupt to quit
flock(40, LOCK_EX
哇哦,在我看来,Apache 进程好像不知何故卡住了,一旦超过最大连接限制,它就会停止创建新实例。但它们为什么会卡住呢?
htop、iotop、jnettop 没有报告任何异常。(没有过载)
更新 2:过去两天服务器不再崩溃。所以我无法获取更多信息。相反,我感谢您的帮助并接受答案。一旦有更多信息可用,我将留下一个链接,指向一个结构更好的新问题。谢谢
答案1
无论“service apache2 status”报告什么,当您执行 ps aux 时是否看到 apache 进程?
问题发生时,您可以执行 netstat -n 吗?也许您用尽了资源(例如文件描述符),或者打开了太多连接。
出现问题时,您的 CPU 利用率是否很高?系统内存是否用尽,是否出现抖动?
http 服务器响应“连接被拒绝”或“连接超时”?
对于后一种情况,我建议执行 strace -f -p [apachepid],您可能会发现哪个系统调用阻止了请求。对于前一种情况,可能是 apache 崩溃了。
您是否代理 Tomcat 或其他应用程序服务器,或者您是否提供纯静态 html?
您是否配置了身份验证?例如,身份验证层可能出现问题
更新:
在第二个 strace 中,我看到了这个 flock(40,LOCK_EX 也许进程试图在某处获取独占锁?您可以执行 lsof -n -p 8554 (或任何 pid 尝试 flock)并查看它尝试锁定哪个文件(40 是文件描述符)。您也可以“ls /proc/8554/fd”