如何确定导致 Apache 正常运行几天后挂起的原因?

如何确定导致 Apache 正常运行几天后挂起的原因?

我无法找到为什么 Apache 在正常运行几天后就挂起了。

以下是按内存排序的 top 的输出

top - 14:51:45 up 1 day, 18:02,  3 users,  load average: 6.73, 5.15, 6.27
Tasks: 233 total,   1 running, 226 sleeping,   0 stopped,   6 zombie`
Cpu(s): 34.0%us, 13.8%sy,  0.0%ni,  3.2%id, 48.3%wa,  0.0%hi,  0.8%si,  0.0%st
Mem:   4043688k total,  3943568k used,   100120k free,    46784k buffers
Swap:  1051376k total,   659504k used,   391872k free,   372016k cached


  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
17156 apache    40   0  271m 204m 5800 S  0.0  5.2   0:10.53 httpd
16735 apache    40   0  273m 204m 5504 S  0.0  5.2   0:05.32 httpd
17532 apache    40   0  271m 204m 5188 S 81.1  5.2   0:07.83 httpd
17904 apache    40   0  271m 204m 5396 S  0.0  5.2   0:09.81 httpd
17177 apache    40   0  271m 203m 5248 S  0.0  5.2   0:05.63 httpd
19507 apache    40   0  271m 203m 5272 S  0.0  5.2   0:05.14 httpd
16734 apache    40   0  271m 203m 5380 S  0.0  5.2   0:10.20 httpd
18571 apache    40   0  271m 203m 5240 S  0.0  5.2   0:05.05 httpd
19492 apache    40   0  271m 203m 5212 S  0.0  5.2   0:05.30 httpd
19506 apache    40   0  271m 203m 5188 S  0.0  5.2   0:10.28 httpd
19497 apache    40   0  271m 203m 5172 S  0.0  5.2   0:07.65 httpd
17527 apache    40   0  271m 203m 5240 S  0.0  5.2   0:05.03 httpd
19144 apache    40   0  271m 203m 5220 S  0.0  5.2   0:02.58 httpd
19145 apache    40   0  271m 203m 5152 S  0.0  5.2   0:02.60 httpd
17165 apache    40   0  271m 203m 5104 S  0.0  5.1   0:02.63 httpd
17900 apache    40   0  271m 203m 4576 S  0.0  5.1   0:05.08 httpd
17174 apache    40   0  271m 193m 5300 S  0.0  4.9   0:10.04 httpd
16742 apache    40   0  271m  84m 5468 S  0.0  2.1   0:20.03 httpd
19812 apache    40   0  100m  33m 4812 D  7.6  0.8   0:00.23 httpd
16741 apache    40   0  271m  18m 5700 S  0.0  0.5   0:08.16 httpd
 5095 root      40   0 84448  13m 4388 S  0.0  0.3   0:14.79 httpd
 4511 named     40   0 51340  10m 1128 S  0.0  0.3   2:13.22 named
 4697 mysql     40   0  153m 8964 2560 S  0.0  0.2   4:50.60 mysqld
16727 apache    40   0 73828 7752  444 S  0.0  0.2   0:00.00 httpd
 4245 sso       40   0 28268 3224 1628 S  0.0  0.1   0:00.10 sw-engine-cgi
25520 root      40   0 68164 3052  276 D  0.0  0.1   1:58.79 tar
25473 psaadm    40   0 38364 2564  852 S  0.0  0.1   0:01.69 sw-engine
25512 root      40   0 14112 2432  808 S  0.0  0.1   0:00.78 python
 4912 root      40   0 35160 1648  460 S  0.0  0.0   0:11.67 spamd
28823 root      40   0 12092 1556 1320 S  0.0  0.0   0:00.08 sshd
13713 root      40   0 12092 1444 1324 S  0.0  0.0   0:00.36 sshd
 6829 root      40   0 12092 1440 1320 S  0.0  0.0   0:01.65 sshd
 4240 sso       40   0 27204 1140  760 S  0.0  0.0   0:00.21 sw-engine-cgi
20409 qmailr    40   0  4908 1060  884 S  0.0  0.0   0:00.00 qmail-remote.mo
 7073 root      40   0  5112 1032  816 S  0.0  0.0   0:00.01 bash
20135 qmaild    40   0  4920 1032  864 S  0.0  0.0   0:00.00 qmail-smtpd
19755 qmaild    40   0  4920 1028  856 S  0.0  0.0   0:00.00 qmail-smtpd
13757 root      40   0  4992 1016  804 S  0.0  0.0   0:00.00 bash
29109 root      40   0  2416 1016  724 R  0.0  0.0   0:06.99 top
20133 qmaild    40   0  4920 1000  832 S  0.0  0.0   0:00.00 qmail-smtpd

我做了一个strace -p [pid]并发现这些进程正在执行正常的 Apache 操作......

答案1

在建议的现有线程中设置指定的服务器状态。进程大小看起来过大。这看起来您可能存在内存泄漏。

我发现将 MaxRequestsPerChild 设置为 1000 或 100 有助于解决代码中存在内存泄漏或其他问题的问题。这通常会在进程引发问题之前将其终止。这可以让您有时间追踪问题。

答案2

Apache 完全挂起是非常罕见的事情。

如果您在这些挂起时间附近阅读 Apache 的访问/错误日志会怎么样?每次发生这种情况时,是否会访问某个特定的 URL?

您的安装是基本的 Apache + PHP + MySQL 安装,还是安装了一些更奇特的东西。比如安装了一些 PHP 操作码缓存(如 xCache)?

httpd.conf 怎么样?您是否设置了一些非常长的超时值?并且您是否打开或关闭了 KeepAlive?

命令阿帕奇在调试期间也非常有用。

编辑:有时 .htaccess 或 PHP 代码中的错误重定向可能会导致一些非常严重的服务器崩溃。如果您的 .htaccess 文件包含类似以下行

ErrorDocument 404 http://yourserver/notfound.html

并且该文件不存在,Apache 将进入非常快速的重定向循环,在几秒钟内使一切变得混乱。

正确的 ErrorDocument 行应该是这样的

ErrorDocument 404 /some/path/notfound.html

此外,Apache 重写模块还可能因为某些错误的重写规则而导致服务器崩溃。Mod_rewrite 是巫术。非常酷,但仍然是巫术,有时还是一种极其有效的大规模杀伤性武器。

答案3

看起来他们都在等待磁盘 I/O。

你可以使用以下方法进行更深入的挖掘strace -p <pid>

答案4

已经有了一个线程提供对您有帮助的信息。

我建议您首先尝试有关“服务器状态”的已接受帖子,然后按照我的建议操作:更改 LogLevel。

相关内容