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


16

liquidsoap + icecastバンドルと単純なWebサイト(httpd + mysqld)を実行するサーバーがあります。特にない。1日あたり約2000人以上の訪問者。平均で約50人が同時にオンラインになっています。

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

メモリを正確にリークするものを検出するために何ができますか?topを使用してリソースの使用状況を監視しますが、見た限りでは何の有用性もありません。

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

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


サーバーの代わりにいくつかのサービス(apache、liquidsoap)を再起動しない理由は何ですか?
ジェームズポ

元々、通常のメモリ使用量に対して応答しました。問題を特定するのに役立つツールのセットで更新しました。
-BillThor

@jamespo、実際にそれを試してみましたが、効果はなかったので、再起動することが唯一の助けになるとわかっていました。
jayarjo

キャッシュされた4027092kがメモリ使用量を説明するはずです。私は現在、他の場所で同様の問題に取り組んでいますが、これまでのところ、次のパラメータでメモリ転送を調整できることがわかりました:vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratioこれは完全な修正ではなく、フィードバックもありません大歓迎です。それが正しい方向であることを願っています。

回答:


16

topバッチモードで実行してメモリサイズを定期的に報告することにより、状況が悪化したときに誰がメモリを使用しているかを確認できます。runingてsarバッチモードでは、メモリの使用、および関連するI / O上でいくつかの良い診断を与える必要があります。muninシステムを監視するために実行すると、どのメモリが使用されているかについての詳細なグラフが表示されます。これは大いに役立つかもしれません。

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

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

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

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

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

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


私の場合の問題はちょっと奇妙です。負荷が大きく、サーバーが頻繁にスワップする場合でも、十分な空きメモリがあります(バッファーとキャッシュについて読んだ後で理解したように)。topは、メモリを占有するプロセスを表示しません。しかし、負荷が上がり、ある時点でサーバーが使用できなくなります:| 詳細な対応ありがとうございます。
jayarjo

2
@jayarjo:Muninとsarは、何が起こっているかを検出するのに役立つはずです。空きメモリがたくさんある場合は、交換しないでください。別のI / O問題がある可能性があります。 sarどのパーティションにI / Oがあるかを特定し、問題を発見するのに役立ちます。
-BillThor

MaxRequestsPerChildアドバイスの+1
jamespo

11

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

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

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

ps auxf

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


これらは便利なコマンドです。今後も注意してください。しかし、問題は常に同じプロセスが上にあることです(添付のスクリーンショットで見ることができます)-apache、mysql、liquidsoap、icecast。そして、サーバーが負荷で死にかけている場合でも、同じ量のメモリを使用します(または少なくとも使用することが示されています)。
jayarjo

@jayarjo:プロセスの数は変わりますか?より多くのプロセスがありますか?それは物理サーバーですか、それとも仮想サーバーですか?
ラファエルルーティガー

プロセスの数に変化はありません。基本的にtopを実行すると、サーバーが負荷で死にかけている間に、元の質問で添付したものと非常によく似た画像が表示されます。サーバーは物理的です。
jayarjo

2
「vmstat」(vmstat -sなど)で詳細情報を取得してください。または、前述のツール「sar」を使用します。RAMベースのファイルシステムをお持ちですか?次に、「iostat」でさらに情報を提供できます。
ラファエルルーティガー

1
メモリリークを検出しようとする場合、「pmem」(%MEM)フィールドpsまたはtop出力が正しいものかどうか疑問に思っています。これは、プロセスが現在使用している物理メモリの割合だけではありませんか?ただし、プロセスの使用済み(リークを含む)メモリの他の部分はスワップアウトされる場合があります。プロセスのサイズを測定するには、おそらく「size」または「vsize」の方が適切でしょうか?例えば、ps -A --sort -size -o comm,size | head -n 11またはps -A --sort -vsize -o comm,vsize | head -n 11
imz-Ivan Zakharyaschev

8

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

実際のメモリ使用量がプログラム使用量の観点から何であるかについてより良いアイデアを得るには、ページキャッシュを表す「キャッシュされた」値を差し引く必要があります。

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

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


はい、そのリンクを見つけてバッファとキャッシュについて読みましたが、私が読んだものから得ることができる限り、それらはスワッピングを引き起こすことはできませんか?
jayarjo

@jayarjoそこに何が起こるかを理解するには、問題を実証する統計が必要だと思います。指定した数値は、スワッピングや大量の実際のメモリ使用量を示していません。
マシューイフェ

1

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

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