ApacheとPHPでメモリリークを調査する方法は?


16

財務モデリングを実行する重いDrupal Webサイトを運営しています。私たちは、Apacheプロセスの数が安定したままで、Apacheが使用するメモリが時間外に増加するという事実を考えると、ある種のメモリリークに直面しているようです。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

/etc/init.d/httpd reloadメモリ使用量が低下するため、apache / PHPからメモリの問題が発生していることがわかります(上記のスクリーンショットおよびCLI出力を参照)。

httpdのリロード前

$無料
             キャッシュされた使用済み共有バッファの合計
Mem:49447692 45926468 3521224 0 191100 22609728
-/ +バッファ/キャッシュ:23125640 26322052
スワップ:2097144 536552 1560592

httpdのリロード後

$無料
             キャッシュされた使用済み共有バッファの合計
Mem:49447692 28905752 20541940 0 191360 22598428
-/ +バッファ/キャッシュ:6115964 43331728
スワップ:2097144 536552 1560592

各Apacheスレッドにはmemory_limit、512MBのPHPが割り当てられます。これは、高いメモリ使用量が要求の少ないボリュームを悪化させることを説明し、max_execution_time120秒のスレッドは実行に時間がかかるスレッドを終了するため、メモリ使用量の継続的な増加を防ぐ必要があります見て。

Q:このメモリリークの原因を調査するにはどうすればよいですか?

理想的には、開発チームを煩わせることなくシステムで実行できるトラブルシューティング手順を探しています。

追加情報:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

参考までに、私たちは個別に調査しているスワッピングの問題を認識しており、スワッピングが発生する前に観察したメモリリークとは何の関係もありません。


前回、LAMP + Drupalで深刻なメモリ使用量の問題が発生したのは、PHP memcachedライブラリを使用していたときです。私がそれを取り除いた後、メモリ使用量は非常に劇的に減少しました。ただの推測。少し後で適切な返信を入力する場合があります。
ジャンヌピッカライネン

@JannePikkarainen:PHP memcachedライブラリを使用しています。memcacheの管理ページに基づいてmemcache.php確認できるのは、使用中の5GBmemcacheに割り当てられて3.3GBいることだけです。ここで私たちをさらに支援できれば素晴らしいと思います。
マックス

はい、memcachedデーモン自体はおそらく問題ありません。メモリをリークする場合としない場合があるのは、PHP memcacheライブラリです(したがって、Apacheプロセスのメモリ使用量が増加します)。私の問題は約1〜2年前だったので、その後は問題が修正された可能性があります。とにかく、memcachedが必須でない場合は、しばらく無効にして、Apacheのメモリ使用量が増え続けるかどうかを確認してください。
ジャンヌピッカライネン

実際の問題は何ですか?パフォーマンスが悪いですか?あなたは私たちがあなたが解決するのを助けることになっている問題を説明することなく、私たちに症状を伝えています。(そして、あなたが話しているこのスワッピングの問題とは何ですか?パフォーマンスに影響を与えるほどスワッピングしますか?)
デイビッドシュワルツ

@DavidSchwartz:問題は、再起動しないhttpdと、メモリ使用量が増加し続け、メモリ不足のカーネルメッセージが表示されてボックスが最終的にクラッシュすることです。パフォーマンスは良好です(メモリ使用量がメモリ制限に近づくまで)。スワッピングの問題を無視してください。
マックス

回答:


12

/etc/init.d/httpdをリロードするたびにメモリ使用量が低下するため、apache / PHPからメモリの問題が発生していることがわかります。

いいえ-それは単にウェブトラフィックに関連していることを意味します。あなたはボックス上でmysqlを実行していると述べました-おそらくウェブサーバーのデータを管理しています-それはここで簡単に犯人である可能性があります。あなたが言及していないウェブスタックが使用する他のサービスと同様に。

各Apacheスレッドには、512MBのPHP memory_limitが割り当てられます。

いいえ、そうではありません。平均7、最大25のビジーサーバーを報告していますが、メモリグラフには約25Gbのデルタが表示されています。

本当に基本的なHTTPチューニングからやり直す必要があります-常に256のhttpdsを実行しているようですが、ピーク使用量は25です-これは単なる愚かなことです。

120秒のmax_execution_timeは、実行に時間がかかっているスレッドを終了する必要があります

いいえ-実行スレッドがPHPインタープリター内にある場合のみ-PHPがブロックされている場合ではありません。

財務モデリングを実行します

(はぁ)

Apache、スレッドまたはプリフォークの設定方法、バージョン、PHPの起動方法(モジュール、cgi、fastcgi)、永続的な接続を使用しているか、ストアドプロシージャを使用しているかなどの詳細を提供していただければ助かります。

mysqlを別のマシンに移動することから始め、永続的な接続の使用を停止することをお勧めします(現在使用している場合)。メモリ制限をはるかに低く設定し、スクリプトごとにこれをオーバーライドします。循環参照ガベージコレクターがインストールおよび構成されていることを確認してください。


2

あなたはおそらく今までにあなたの問題を解決したでしょう。サーバーのスワッピング/スラッシングを防ぐために、cronから次のコマンドを1時間ごとに実行します。

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

これが解決策であると言っているのではなく、実際にメモリリークの原因を調査する際に、物事を実行し続け、ダウンタイムを最小限に抑えるための方法にすぎません。

詳細はこちらをご覧ください。

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/


1

どうやらこれはPHPの動作方法です-オブジェクトを割り当てている長いループを実行していて、参照を介してオブジェクトを渡すかどうかを知っている場合、それを処理する唯一の方法は各PHPプロセスのNリクエストの後ですそれを止めるために。PHPをCGIとして実行すると、すべてのリクエストでリスポンが再生成されるため、メモリリークは発生せず、パフォーマンスの低下はそれほど大きくないかもしれません。fast-cgiを実行することもできます。たとえば、1000件ごとにphp-fcgiプロセスが強制終了され、メモリが解放されます-ここでもメモリリークはありません。モジュールmod_phpとしてPHPを実行する場合、httpd.confでmaxrequestsをセットアップして、それが役立つかどうかを確認することができます。例えば10をセットアップしようとします-それが機能する場合、パフォーマンスの低下は高くありませんが、メモリリークはないはずです、


-1

グローバルphp.iniファイルのメモリを確認します。1 Gなどのように単純に値をデカールしないでください。サーバー全体に影響を与えないように、ローカルのphp.iniをそのアカウントに取り込むことを強くお勧めします。通常、ほとんどのアカウントではこれで十分であるため、グローバルなphp.iniの制限を約64Mに設定することをお勧めします。

Apacheの設定も確認してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.