web-dev-qa-db-ja.com

何かがすべてのメモリを消費します(一部のアプリでメモリリークが疑われます)。何を検出するのですか?

Liquidsoap + icecastバンドルとシンプルなウェブサイト(httpd + mysqld)を実行するサーバーがあります。特にない。 1日あたり約2000人以上の訪問者がおり、平均して同時に約50人が同時にインターネットにアクセスしています。

サーバーには8GB RAMがあります。時間が経つにつれ、サーバー上で何も新しいものが開始されず、新しいユーザーがいないにもかかわらず、空きメモリの量は常に減少します。ある時点でスワップが始まり、サーバーの負荷が上がり、応答しなくなります。通常、私はサーバーを再起動するだけです...

メモリリークを正確に検出するために何ができますか?私はtopを使用してリソースの使用状況を監視していますが、私が見る限り、何も役に立たないように見えます。

enter image description here

その多くのメモリを使用しているものを見つける方法はありますか?または何がディスクに激しくスワップし始めますか?サーバーを再起動せずにメモリを解放する方法はありますか?

16
jayarjo

バッチモードでtopを実行して定期的にメモリサイズを報告することで、南に行ったときに誰がメモリを使用しているかを確認できます。バッチモードで sar を実行すると、メモリの使用状況と関連するI/Oに関する適切な診断が得られます。 muninを実行してシステムを監視すると、使用されているメモリの詳細を示すグラフが表示されます。これは非常に役立ちます。

Limits.confを使用して、プログラムの最大コアサイズを制限できます。適切に設定すると、メモリをリークしているすべてのプログラムが強制終了されます。これはpam_limitsモジュールで動作します。制限はulimitsコマンドでも設定できます。

大量のメモリを使用する可能性のあるいくつかのプログラムを実行しています。あなたが見ることができるいくつかのものが含まれます。

  • Apache2で実行されているプログラムが不十分なアプリケーションは、メモリリークを引き起こす可能性があります。これが発生すると、メモリサイズが増加するはずです。 MaxRequestsPerChildを100程度に設定することにより、Apache2を調整して、一定回数使用した後に子をリサイクルすることができます。これで問題が解決した場合は、リークを解決する必要があります。私はこれを最初に見ます。
  • MySQLはデータをメモリにロードしようとする場合があります。メモリに多くのデータがある場合、これはスラッシングを引き起こす可能性がありますが、見ているほど劇的ではありません。
  • 大きなtmpfsファイルシステムをマウントしている場合、使用時にファイルを削除しないと、メモリリークが発生する可能性があります。長い寿命のファイルも問題になる可能性があります。
  • 問題がほぼ同じ時刻に発生する場合は、スケジュールされたプログラムがメモリリークしている可能性があります。
  • 共有メモリを割り当てるプログラムがあるが、終了する前にそれを解放しない場合、比較的目に見えないメモリリークが発生します。共有メモリがメモリ内でロックされている場合、スワップが強制される可能性があります。使用可能な共有メモリの量は通常、比較的制限されています。
  • Liquidsoap + icecastバンドルは、メモリを使用するバッファリングの問題に遭遇する可能性があります。私はこの組み合わせを使用したことがないので、これがどのように表示されるかわかりません。

通常のメモリ使用量:空きメモリは、多くのことを望むものではありません。システムが長時間稼働していて、空きメモリが多い場合は、何か問題があります。ファイルを読み書きするたびに、ブロックはバッファキャッシュに入れられます。これは空きメモリを減らし、良いことです。システムは、他の場所でメモリを探すことなく、いくつかのプログラムを開始するのに十分な空き領域を維持します。多くのプログラムはすぐに実行されるため、実行が停止すると、メモリは空きプールに戻されます。

バッファキャッシュ内のファイルを読み取る場合、ディスクアクセスは必要なく、読み取りはバッファキャッシュから解決されます。書き込みも同様のメカニズムを使用します。システムにメモリが必要な場合、バッファキャッシュは最初に使用される場所の1つです。ほとんどのバッファはすぐに解放できます。

メモリリークがある場合は、空きメモリとバッファの両方が縮小し始めます。リークしたメモリは最終的にスワップ領域に移動する必要があるため、これはまだ重大な問題ではありません。スワップスペースがいっぱいになるまでシステムは正常に動作し、残りの空きスペースをプログラムが開始できないポイントまで引き下げます。通常、少量のスワップ領域が使用される場合があります。

16
BillThor

このコマンドを使用して、RAMの使用法に関するトップ10アプリケーションを表示できます。

ps -A --sort -rss -o comm,pmem | head -n 11

このコマンドは、多くのサブプロセスが生成されている場合に役立ちます。

ps auxf

これにより、どのプロセスが一緒に属しているかを確認できます。

11

アプリケーションの観点から実際にそのメモリを使用しているものはありません。

実際のメモリ使用量がプログラムの使用量に関してどのようになっているかをよりよく理解するには、ページキャッシュを表す 'cached'値を差し引く必要があります。

基本的にこれは優れたメモリ管理であり、理想的にはこれが理想です。

詳細については、こちらのリンクを参照してください: http://www.linuxatemyram.com/

8
Matthew Ife

私は本当にプロではありませんが、液体石鹸とアイスキャストはマルチメディア関連です。システムが解放されると、将来の使用に備えてメモリがキャッシュまたは占有されます。そして、トラフィックがその日の特定の時間に/一定期間にわたって増加した場合、スワッピングが開始されます。この時点で、リクエスト(コンテンツを表示するユーザー)が増加すると、必要なリソースは8GBを超えるRAMになります。

1
Yash