web-dev-qa-db-ja.com

Linuxが「空き」メモリを奇妙に報告するのはなぜですか?

これは、UNIXオペレーティングシステムがメモリ使用量を報告する方法についての 標準的な質問 です。
同様の質問:

稼働中の本番サーバーがありますDebian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-AMD64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

毎日cronがrootとしてバックアップスクリプトを実行します。

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

すべてが完璧に動作しますが、Muninのメモリーグラフcacheおよびbuffersバックアップ後。

次に、バックアップファイルをダウンロードして削除します。削除後、Muninのメモリグラフcachebuffersをバックアップ前の状態に戻します。

Muninグラフは次のとおりです:

外部でホストされた画像はリンク切れでした。

44
user135199

これは サーバーがスワップパーティションの使用を拒否する と同じ "問題"であり、このサイトの他のいくつかの同様の質問です。 ( Linuxサーバーでの高メモリ使用量LINUXでのメモリ使用量メモリが不足しているWebサーバー など)

メモリの消費量がcacheであることに注意してください。これは、ファイルをメモリに保持していることを意味します。キャッシュされたメモリは「空き」メモリです。メモリのブロックを空のままにする代わりに、OSは最近読み取ったファイルをそのスペースに保持します。アプリケーションがそのメモリを必要とする場合、そのメモリはアプリケーションによって使用されます。それまでは、ファイルが頻繁に参照される場合に、ディスクからファイルを再度読み取る必要がないようにするチャンスです。

このグラフによると、グラフの期間全体で、効果的なメモリ消費量はまったく変化していません。

27
Jeff Ferland

Linux Ate My Ram の問題が発生しています。

パニックにならないでください。

これは問題ではありません。

システムは設計どおりに機能しています。

問題はお使いのOSではありません-問題は、「空き」メモリとは何かについての理解です。


Unixシステムは、単にプログラムを実行する以上の目的でメモリを使用します。メモリは次の目的で使用されます。

  • 実行中のプログラム(アクティブ/使用中)
  • 転送中のデータのバッファリング(バッファ)
  • 最近ディスク(キャッシュ)に読み書きされたデータのキャッシュ
  • 絶対に何もない(無料)

以下は、最近のUnixシステムがRAMの使用状況を報告する方法の簡単な(そして大部分は不完全な)ツアーです。

空きメモリ(OS定義)とは何ですか?

UnixシステムがRAMをFreeとして報告している場合、これは「これにRAMを使用していない」という意味です。
無料 RAMは実質的に価値がありません-システムを高速化するのではなく、何かが必要な場合に備えて「無料」で座っているだけです。その何かは、私が前述した他の3つの項目のいずれかである可能性があります。

キャッシュおよびバッファメモリとは何ですか?

キャッシュメモリとバッファメモリは、オペレーティングシステムがシステムを高速化するために使用しているRAMです。
このメモリは現在プログラムを実行するために必要ではないので、OSはそれを使用して、頻繁に必要なデータを保持します-たとえばCライブラリ(必要)実行するほとんどすべてのプログラム)は、ほとんど常にcacheメモリに保持されるため、システムはディスクに移動して、画面に「Hello World」を印刷するために必要な指示を見つける必要はありません。
それは実際にはそれよりはるかに複雑です-共有メモリ、有線メモリなどがあります-しかし私たちの目的のためにこれは簡単な説明で十分です。

アクティブメモリとは何ですか?

アクティブメモリは、「使用済み」メモリとして理解されている部分です。RAMアプリケーションは、スプレッドシートの並べ替え、Webページの提供、グラフィックの編集など、あらゆる用途に使用しています。
「アクティブ」メモリは最近「アクティブ」になりました-その内容を使用(読み取りまたは書き込み)したと主張するプログラムであり、スワップアウトの良い候補とは見なされません。

非アクティブメモリとは何ですか?

アクティブメモリと同様に、非アクティブメモリはRAMであり、アプリケーションは何のためにでも使用します。違いは、このメモリはしばらくアクセスされていないことです。したがって、PushがOSを押し出すようになった場合、OSはディスクにスワップアウトできると判断し、(少し運がよければ)再度要求しないと主張するプログラムはそうします。気づかないでしょう。

「使用済み」メモリとは(人間の定義)

あなたと私が「使用済み」メモリと考えるものは、基本的に、アクティブメモリと非アクティブメモリの合計です。アプリケーションが現在使用を主張しているすべてのRAM。
アクティブメモリと非アクティブメモリの合計よりも多くのRAMをインストールしている限り(プラス512-1024MBのニースの安全マージンも)、問題はありません。 OSおそらくはスワップにヒットせず、パフォーマンスを低下させません。

「空き」メモリとは(人間の定義)とは何ですか?

あなたと私が「フリー」メモリと考えるのは、プログラムを実行するために利用可能なメモリです。
これは、OSがレポートする「無料」の数値よりも少し複雑です。プログラムがRAMを要求すると、オペレーティングシステムは、次のような最小限の中断でRAMを取得しようとします。

  • 利用可能な空きメモリがある場合(何もしないで座っている場合)、そのRAMが割り当てられます。
  • 利用可能な空きメモリがない場合、OSはキャッシュとバッファスペースを共食いします:バッファプール内の最も最近/最も頻繁にアクセスされないものは破棄され、そのRAMがプログラムに与えられます。
  • バッファ/キャッシュRAMがない場合、スワッパーは非アクティブなメモリを調べて、アクセスされる可能性が最も低いと思われる領域を選択します。そのデータはページアウトされてスワップ(ディスク)され、新しく解放されたRAMがプログラムに渡されます。
  • すべての非アクティブRAMがスワップアウトされている場合、スワッパーはディスクにアクティブRAMを配置し始めます。
    (これはパフォーマンスが通常犬に行くところです:プログラムがCPUにターンするたびに、スワップアウトされたビットをRAMに戻す必要があります。つまり、他のプログラムのアクティブメモリをスワップアウトする必要があります-スワップの高いターンオーバーが呼び出されますthrashing
  • システムが可能なすべてをスワップアウトした(そしてスワップパーティションをいっぱいにした)場合、またはシステムを実行している場合スワップパーティションなしである場合悪いこと起こります。この時点で、次の2つのいずれかが発生します。
    • malloc()は失敗します。これはPOSIX準拠の動作です。オペレーティングシステムは、プログラムがRAMを要求しているため、要求を満たすことができないことを通知します。
      プログラムは、より少ないRAMを要求するか、またはメモリの小さなチャンクで間に合わない場合、クリーンアップして終了することができます。 (プログラムが正しく記述されていない場合は、単にクラッシュします。)
    • Linuxボックスを使用している場合、 OOM-Killer はギャングスタイルのドライブバイキルを実行し、他のプロセスを終了して、十分なRAMを解放しようとします。要求に応えます。
      ここの私の説明とリンクされた質問の私の答えでは分からない場合は、これは問題に対処するためのひどい方法だと思います。

ファイルを削除すると無料RAMが上がるのはなぜですか?

ここの質問の例では、バックアップファイルを削除することでRAMを「解放」できることに気付きました。その説明は非常に単純です。そのファイルを使用しているものがないため(開いているファイルハンドルがないため)また、ファイルシステムからアクセスできなくなった(リンク解除された)OSは、そのデータに再びアクセスする人がいないことを認識し、ファイルシステムキャッシュからデータを削除します。
これにより、OSはより多くの空きメモリを報告しますが、システムのパフォーマンスには影響しません。

61
voretaq7

上記が失敗するかどうかを確認するための何か:

スラブキャッシュの使用状況を確認してください(Slab:SReclaimable:SUnreclaim:および/proc/meminfo)。これはカーネル内のデータ構造のキャッシュであり、freeによって報告されるページキャッシュとは別のものです。

「メモリ不足」の大部分がスラブキャッシュの原因である可能性がある場合は、/proc/slabinfoをチェックして、どこになくなったかを確認してください。 dentriesまたはinodeの場合は、sync ; echo 2 > /proc/sys/vm/drop_cachesを使用してそれらを取り除くことができます。

slabtopツールを使用して、スラブキャッシュの現在の使用状況をわかりやすい形式で表示することもできます。 cは、現在のキャッシュサイズでリストを並べ替えます。

差出人: https://stackoverflow.com/a/5467207

2
Chris S