我在使用 apache2 httpd 时遇到了问题。apache 使用 mpm_prefork,而 Web 应用程序使用 php。
我注意到运行 apache 的机器在夜间突然 CPU 使用率降至 0%。当我去调查问题时,我看到 75 个 apache 进程(75 是 MaxClients),它们都没有执行任何操作。
当我跟踪 Apache 进程时,每个进程都给出了以下输出
Process 18845 attached - interrupt to quit
restart_syscall(<... resuming interrupted call ...>) = 0
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 0 (Timeout)
poll([{fd=22, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)
好的,fd22 是什么?
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
/usr/sbin 18839 www-data 22u IPv4 129846157 0t0 TCP myhost:44697 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 18844 www-data 22u IPv4 129860789 0t0 TCP myhost:44906 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 18845 www-data 22u IPv4 129846238 0t0 TCP myhost:44791 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 18848 www-data 22u IPv4 129858987 0t0 TCP myhost:44967 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 18852 www-data 22u IPv4 129861780 0t0 TCP myhost:44915 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 18864 www-data 22u IPv4 129856031 0t0 TCP myhost:44795 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 18873 www-data 22u IPv4 129856418 0t0 TCP myhost:44908 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 19225 www-data 22u IPv4 129858977 0t0 TCP myhost:44936 -> otherhost:http-alt (ESTABLISHED)
/usr/sbin 19230 www-data 22u IPv4 129857945 0t0 TCP myhost:44955 -> otherhost:http-alt (ESTABLISHED)
这是与另一台主机的连接。显然,这台机器(也在我们的网络中)在半夜的 cronjob 期间出现故障,大约 2 小时内没有响应任何请求。好吧,我目前无法修复另一台机器的问题,而且我也不关心其他机器的状况。
我唯一希望的是,如果进程无法及时完成,它们就会死掉。显然,轮询系统调用中的进程不计入 php max_execution_time。
我能以某种方式告诉 apache 终止这些陈旧的进程吗?
Debian GNU/Linux 7.8
apache2:
2.2.22-13+deb7u4
apache2-mpm-prefork:
2.2.22-13+deb7u4
apache2.2-bin:
2.2.22-13+deb7u4
apache2.2-common:
2.2.22-13+deb7u4
libapache2-mod-php5:
5.3.29-1~dotdeb.0
答案1
您可以尝试 TimeOut 指令是否可以解决问题http://httpd.apache.org/docs/2.2/mod/core.html#timeout