[PHP-users 70] 暴走するhttpdプロセスの正体を確かめたい

Ryuzi Kambe php-users@php.gr.jp
Fri, 15 Jun 2001 18:43:32 +0900


Ryuzi Kambeと言います。

現在、RedHat 6.2(kernel 2.2.16)、Apahce 1.3.14上で
PHP 4.0.5を使っています。先日PHPLibを導入したのですが、
その時期からなぜか突然httpdプロセスが暴走するように
なってしまいました。

自分のコンフィグレーションやコードの書き方がおかしいの
だろうと思い、その箇所を突き止めようと思うのですが、
psコマンドやtopコマンドを見ても、どのスクリプトの
どのコードが問題になっているのかを突き止めるのに
苦労しています。暴走はするものの、プロセスが停止したり、
エラーを出力しないために、何が問題だったのかわからない
ままでいます。

ちなみに、PHPLIBのバックエンドには、MySQLを使っていますが、
http://sidecar.ics.es.osaka-u.ac.jp/php-jp/archives/msg04174.htmlhttp://sidecar.ics.es.osaka-u.ac.jp/php-jp/archives/msg04176.html
とは関係ないようです(該当する個所はmysql_conectに直しました。

具体的には、top コマンドで確認すると、httpdのプロセスが
暴走している時には、

  PID USER     PRI  NI  SIZE  RSS SHARE STAT  LIB %CPU %MEM   TIME COMMAND
12651 user      13   0   884  884   668 R       0  2.7  1.4   0:00 top
10922 nobody     4   0  3132 2772  1556 S       0  1.5  4.5   0:11 httpd
11481 nobody     2   0  2988 2608  1564 S       0  0.5  4.2   0:09 httpd

のCPUの部分が PRI 18〜20 , %CPUが75-99%(同様のプロセスが多数ある場合は
%CPUをプロセスの一で割ったような値が連続して現れます。

また、topコマンドを実行すると、STATが「D」の状態になったプロセスが
いくつもあります。

このとき、Webサーバに接続しようとしても、タイムアウトになったり、
単なるテキストファイルをロードしようとした場合でも異様に時間がかかります。

主に夜間に発生しますが、翌朝になると、TOPコマンドでそれらの
プロセスの状態が %CPUが75-99%のまま、%MEMが0.0になって、
実際にWebサーバは問題なく利用できるようになっています。

こうなると仕方がないので、Webサーバのデーモンをを再起動したり
httpdのプロセスを一つ一つKILLしたりしています。

TOPコマンドで、ある程度のプロセスの開始してからの時間は
確認できるのですが、(psコマンドの開始からの経過時間とは
違いますが、これはフォーマットが違うのでしょう)、
これがいったいどのスクリプトから発生したのか、確かめることが
できません。

ローカルに同様の環境を設定し、考えられるPHPのスクリプトに
Webブラウザからアクセスしてきて、テストしてみましたが、
原因となるようなプロセスの暴走を引き起こすことが出来ませんでした。

このプロセスが一体どのページをロードしている時、または
した後に暴走したのかというのを、知る方法はないものでしょうか。

PHP 3,4のバージョンを一年以上利用して来ましたが、
今までどうようの問題にあたったことはありません。

また、PerlやCを使ってCGIを動かしたときには、
psコマンドはCGIの時には実行しているスクリプトの
名前がわかるので対処できていました。

Ryuzi Kambe
kambe@mc.kcom.ne.jp