今日、Apacheデーモンを再起動して構成ファイルをリロードしましたが、その後、システム上に多くのphpゾンビプロセスが表示されるようになりました。量は10から30まで変化し、それらはすべて、死ぬまでCPUの小さなスライスを取ります。この問題のデバッグはどこから始めればよいですか?
私が行った変更は、子あたりの最大リクエスト数を0(大量のメモリリーク)から1000に減らすことでした。phpプロセスは、「ダム」デバイスからデータを受信するスクリプトからのものだと思います。彼らはGETパラメータを使用してリクエストを送信し、結果を気にしません。
いくつかのデータ:
うなめ-a
# uname -a
Linux <hostname> 2.6.32-71.29.1.el6.x86_64 #1 SMP Mon Jun 27 19:49:27 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
ps -aux | grep php
# ps aux | grep php
user1 5709 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5717 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5721 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5722 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5723 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5724 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5725 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5729 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5731 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5737 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5760 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5778 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5793 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5798 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5800 1.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5833 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5850 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5870 3.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5875 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5876 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5877 2.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5886 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5926 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5939 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5941 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5961 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5962 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5973 0.0 0.0 0 0 ? Z 12:15 0:00 [php] <defunct>
user1 5977 0.0 0.2 106836 8680 ? R 12:15 0:00 /usr/bin/php /home/user1/public_html/<script>.php
root 5981 0.0 0.0 103228 836 pts/0 S+ 12:15 0:00 grep php
自由
# free -m
total used free shared buffers cached
Mem: 3831 3173 658 0 183 2502
-/+ buffers/cache: 487 3344
Swap: 4031 7 4024
稼働時間
# uptime
12:18:10 up 105 days, 23:21, 1 user, load average: 0.23, 0.20, 0.18
これをデバッグするのに必要なものは他にありますか?
問題じゃない。ゾンビは、CPU、メモリ、またはプロセステーブルスロット以外のものを占有しません。ゾンビはあまり長くぶらぶらしていないので、Apacheマスタープロセスは子プロセスが終了するのを待つ以外のことをしているだけなので、終了するまでに少し時間がかかることがあります子供たちは刈り取られます。
ゾンビのプロゼは、親がすでに死んだ/殺されたプロセスであり、まだ片付けられていません。
これがサービスの再起動中に発生した場合は、完全に正常です。 Linuxプロセスの状態、大まかな情報はここで読む必要があります。
- 実行中:これは、プロセスが実行中であるか、実行の準備ができている状態です。
- 割り込み可能:この状態は、別のプロセスからのイベントまたはシグナルを待機するプロセスのブロック状態です。
- 無停電:これもブロック状態です。ハードウェアステータスが待機し、シグナルを処理できなかったという特定の条件のために、プロセスは強制的に停止されます。
- 停止:プロセスが完了すると、この状態が発生します。このプロセスは再開できます
- ゾンビ:この状態では、プロセスは終了し、情報は引き続きプロセステーブルで利用できます。
ただし、Webサーバーの通常の使用中に発生した場合(結局、phpプロセスについて話している)、Apacheのグレースフルリスタートを実行する毎分cronジョブで一時的に修正することができます(service Apache2 reload
)、しかしこれはあなたの利用可能なスロットを食い尽くす根本的な問題を解決しません。
2番目のケースでは、どのホスティングがゾンビを引き起こしているかを識別する必要があり、アプリケーションを修正する必要があります。このようなゾンビの99%は、不適切にプログラムされたWebサイトが原因です。
Pcntl_fork()でプロセスをフォークした後、コードpcntl_wait()を追加してください
$pid = pcntl_wait($status, WNOHANG);
int pcntl_wait ( int &$status [, int $options ] )
wait
関数は、子が終了するまで、または現在のプロセスを終了するかシグナル処理関数を呼び出すアクションを持つシグナルが配信されるまで、現在のプロセスの実行を一時停止します。呼び出しの時点までに子がすでに終了している場合(いわゆる「ゾンビ」プロセス)、関数はすぐに戻ります。 子が使用するシステムリソースはすべて解放されます