web-dev-qa-db-ja.com

Apache2セットアップでメモリリークが発生していますか?

最近、ApacheがLinodeサーバーで異常な量のメモリ(以前より80MB多い)を使用していることに気付きました。Apache2を再起動すると問題が解決するようです。

サーバー上でmysqlとTomcatだけでなく、Apache上でSVNを実行していますが、どちらも問題ではないようです。 Apacheがメモリを失っている場所をデバッグするにはどうすればよいですか? SVNを除いて、実際にはwordpressブログのみをホストしているため、リークが発生している可能性がある場所がわかりません。ubuntu8.04リポジトリからのデフォルトインストールを使用しました。

何か助けはありますか?

5
Stefan Kendall

Apacheのメモリ処理のニュアンスは、常にますます多くのメモリを消費しているように見えることを意味します-_prefork.c_(私はあなたがそうだと思います)を使用すると、topのVIRT値はしばしば高くなります:

_  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10385 Apache    15   0  376m  48m 3932 R 20.3  1.2   0:01.34 httpd
10423 Apache    16   0  376m  46m 4576 S 15.0  1.2   0:01.09 httpd
10153 Apache    15   0  337m  61m 4672 S 11.6  1.6   0:03.94 httpd
10419 Apache    15   0  383m  54m 4696 S 11.6  1.4   0:01.00 httpd
_

監視する値はRESです。これは子スレッドが消費したメモリの最大量のサイズです(私の場合、PHPはそのスレッドの一部として実行されるため、「ライブラリとデータがロードされると、スレッドは割り当てられたメモリを解放しません。ただし、Apacheプロセスがmaxrequestsの後にスレッドを強制終了すると、

_<IfModule prefork.c>
MaxRequestsPerChild  1000
_

スレッドはネイティブのメモリ消費量に戻ります。これはApacheの再起動と同じ効果ですが、再起動にはサービスの一時的な損失が伴います(ポート80でリッスンしているものはありません)が、MaxRequestsPerChildは子スレッドのみを制御し、ポート80(またはポート80でリッスンしているサービスが存在することを保証します)聴く)。

Apacheの総メモリ使用量を減らすには、必要なApacheモジュールのみをロードしていることを確認し、非常に大きなPHPスクリプト(ini_set('memory_limit', '128M');その後、データを再帰的にロードする間、Apacheのスレッドを監視します。次に、実際の使用中に、Apache MaxRequestsPerChildが妥当なレベルで表示されるまでRES値を下げます。これは下げるだけであることを忘れないでください。子スレッドがその「ライフ」の開始時に大きなスクリプトを実行する可能性(これを実行する子が多いほど、Apacheが使用するメモリの合計が多くなります)。

ここにいくつかの有用なパラメータ調整の記事があります:

6
Andy