私たちの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]
最初に確認することは、これらが追加のプロセスを生成したかどうかです(pstreeを使用可能にしましたか?)。 php exec関数は有効になっていますか?
キープアライブが有効になっているかどうか、およびmaxRequestsが適切な値に設定されているかどうかを確認するその他の事項。スレッドはアイドル状態ですか、それとも処理中ですか?
PHPはデータベースバックエンドと通信していますか?実行スレッドがDBクライアントライブラリに入ると、PHPメモリ使用量と時間制限に関する制約はなくなりますスレッドがPHPに戻るまで適用されます。データベースで遅いクエリが表示されていますか?
チェックする価値のある他のことは、MTAが正しく構成されているかどうかです-例:スマートリレーでsendmailを使用していて、構成したアドレスが間違っている場合、phpのmail()関数が長期間ブロックする可能性があります。
ラスマス・ラードルフのコメントに関するロブ・オルモスの返答がなされました 6年前 声明にはまだいくつかの真実があるかもしれませんが、それは主流の拡張に適用される可能性は低いです。
使用しているOSについては言及していません。Linuxでのスレッド化の利点は、フォーク前と比較してほとんど検出できません。
確かに、他の手段を使い果たして、スレッド化されたApacheに固執する説得力のある理由がない場合は、プレフォークを試す価値がありますが、最初に他の場所を見てください。
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
だから私はそれが問題であると思う。