web-dev-qa-db-ja.com

Apacheプロセスは古くなりますが、タイムアウトしません

Apache2httpdに問題があります。 Apacheはmpm_preforkを使用しており、Webアプリケーションはphpを使用しています。

Apacheが実行されているマシンが、夜間に突然0%のCPU使用率に低下することに気付きました。問題を調査したところ、75個のApacheプロセス(75個はMaxClients)があり、それらはすべて何もしませんでした。

Apacheプロセスをstraceしたとき、それらのすべてが次の出力を出しました

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)

別のホストへの接続。どうやらこの他のマシン(これも私たちのネットワーク内にあります)は深夜のcronジョブ中に誤動作しており、約2時間の要求にまったく応答しません。さて、私は現在、他のマシンの問題を修正することはできません。また、他のマシンの幸福についても気にしません。

私が望んでいないのは、プロセスが時間内に終了できない場合にプロセスが死ぬことだけです。どうやら、ポーリングsyscallのプロセスは、phpmax_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
PhilippN

TimeOutディレクティブでうまくいくかどうか試してみることができます http://httpd.Apache.org/docs/2.2/mod/core.html#timeout

1
g491