web-dev-qa-db-ja.com

ゾンビプロセスが多すぎますPHP

今日、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

これをデバッグするのに必要なものは他にありますか?

2
onik

問題じゃない。ゾンビは、CPU、メモリ、またはプロセステーブルスロット以外のものを占有しません。ゾンビはあまり長くぶらぶらしていないので、Apacheマスタープロセスは子プロセスが終了するのを待つ以外のことをしているだけなので、終了するまでに少し時間がかかることがあります子供たちは刈り取られます。

3
womble

ゾンビのプロゼは、親がすでに死んだ/殺されたプロセスであり、まだ片付けられていません。

これがサービスの再起動中に発生した場合は、完全に正常です。 Linuxプロセスの状態、大まかな情報はここで読む必要があります。

  1. 実行中:これは、プロセスが実行中であるか、実行の準備ができている状態です。
  2. 割り込み可能:この状態は、別のプロセスからのイベントまたはシグナルを待機するプロセスのブロック状態です。
  3. 無停電:これもブロック状態です。ハードウェアステータスが待機し、シグナルを処理できなかったという特定の条件のために、プロセスは強制的に停止されます。
  4. 停止:プロセスが完了すると、この状態が発生します。このプロセスは再開できます
  5. ゾンビ:この状態では、プロセスは終了し、情報は引き続きプロセステーブルで利用できます。

ただし、Webサーバーの通常の使用中に発生した場合(結局、phpプロセスについて話している)、Apacheのグレースフルリスタートを実行する毎分cronジョブで一時的に修正することができます(service Apache2 reload)、しかしこれはあなたの利用可能なスロットを食い尽くす根本的な問題を解決しません。

2番目のケースでは、どのホスティングがゾンビを引き起こしているかを識別する必要があり、アプリケーションを修正する必要があります。このようなゾンビの99%は、不適切にプログラムされたWebサイトが原因です。

0
sjas

Pcntl_fork()でプロセスをフォークした後、コードpcntl_wait()を追加してください

$pid = pcntl_wait($status, WNOHANG);
int pcntl_wait ( int &$status [, int $options ] )

wait関数は、子が終了するまで、または現在のプロセスを終了するかシグナル処理関数を呼び出すアクションを持つシグナルが配信されるまで、現在のプロセスの実行を一時停止します。呼び出しの時点までに子がすでに終了している場合(いわゆる「ゾンビ」プロセス)、関数はすぐに戻ります。 子が使用するシステムリソースはすべて解放されます

0
Java