web-dev-qa-db-ja.com

Apache mpm_worker + php:プロセスが終了しない

私たちのWebサーバーで、Apacheプロセスが1つまたは2つのスレッドで不安定なままになっているように見える奇妙な問題が発生しています。 php memory_limitをより安全に上げることができるように、より厳密なServerLimitを課したいと思っていたので、これは私にとって当惑させられます。

誰かがこれをトラブルシューティングするための良い方法を知っていますか?それらのプロセスが何をしているのか理解できますか?彼らはどのような状態にありますか?

完全にはわかりませんが、これはApacheサービスを再起動せず、さまざまな理由で1日に2〜3回のリロードを実行することが原因であると考えられます。

例として、Webサーバーの1つは退屈していて、もう1つはかなり課税されています。

  PID        PPID       RES        THREADS   
  *15608     1          29 MB      1         
  8880       1          2 MB       3         
  14989      1          0 MB       1         
  25029      1          0 MB       1         
  2115       15608      3 MB       2         
  13058      15608      361 MB     2         
  14556      15608      157 MB     27        
  19962      15608      23 MB      1         
  21219      15608      387 MB     3         
  21600      15608      3 MB       3         
  21828      15608      3 MB       2         
  30152      15608      3 MB       2     

この例では、かつては制御プロセス(リロード前)であったと私が想定している3つのプロセスがあり、それらは何らかの理由でまだ実行されています。そして、新しい制御プロセスに接続されたプロセスのうち、束はまだそれぞれ2〜3スレッドで稼働しています。

11時間後から、それらの同じPIDの多くはまだ1つのスレッドで存在しています。 MaxRequestsに到達していたら、とんでもないことはやめたと思います。

memory usage report for Apache2
  pid count                     : 11                  
  thread count                  : 46                  
  shared mem usage              : 670 MB              
  total resident size           : 691 MB              
  total cpu usage               : 79 %                
  total memory usage            : 7 %                 
  average mem / pid             : 62 MB               

process breakdown
  PID        PPID       RES        THREADS   
  *15608     1          29 MB      1         
  8880       1          2 MB       3         
  14989      1          0 MB       1         
  25029      1          0 MB       1         
  2115       15608      3 MB       2         
  19962      15608      23 MB      1         
  21219      15608      387 MB     3         
  21600      15608      3 MB       3         
  21828      15608      3 MB       2         
  29239      15608      238 MB     27        
  30152      15608      3 MB       2         

process tree
     |-Apache2-+-3*[Apache2---{Apache2}]
     |         |-Apache2
     |         |-2*[Apache2---2*[{Apache2}]]
     |         `-Apache2---26*[{Apache2}]
     |-Apache2---2*[{Apache2}]
     |-2*[Apache2]
1

最初に確認することは、これらが追加のプロセスを生成したかどうかです(pstreeを使用可能にしましたか?)。 php exec関数は有効になっていますか?

キープアライブが有効になっているかどうか、およびmaxRequestsが適切な値に設定されているかどうかを確認するその他の事項。スレッドはアイドル状態ですか、それとも処理中ですか?

PHPはデータベースバックエンドと通信していますか?実行スレッドがDBクライアントライブラリに入ると、PHPメモリ使用量と時間制限に関する制約はなくなりますスレッドがPHPに戻るまで適用されます。データベースで遅いクエリが表示されていますか?

チェックする価値のある他のことは、MTAが正しく構成されているかどうかです-例:スマートリレーでsendmailを使用していて、構成したアドレスが間違っている場合、phpのmail()関数が長期間ブロックする可能性があります。

ラスマス・ラードルフのコメントに関するロブ・オルモスの返答がなされました 6年前 声明にはまだいくつかの真実があるかもしれませんが、それは主流の拡張に適用される可能性は低いです。

使用しているOSについては言及していません。Linuxでのスレッド化の利点は、フォーク前と比較してほとんど検出できません。

確かに、他の手段を使い果たして、スレッド化されたApacheに固執する説得力のある理由がない場合は、プレフォークを試す価値がありますが、最初に他の場所を見てください。

2
symcbean

PHP mod_php経由で実行されていますか?PHPインストールドキュメントはこれを提供します:

警告Apache2の本番環境でスレッド化されたMPMを使用することはお勧めしません。プリフォークMPMを使用します。これは、Apache2.0および2.2のデフォルトのMPMです。理由については、関連するFAQスレッドMPMで Apache2を使用する際のエントリ )をお読みください。

http://www.php.net/manual/en/install.unix.Apache2.php

だから私はそれが問題であると思う。

0
Rob Olmos