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


44

これは、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のメモリグラフには、バックアップ後のキャッシュバッファの増加が示されています。

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

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

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


3
おめでとうございます、この質問は、(それがこのについて尋ね第六いずれかのよう今日だし、最も興味深いときれいな例を持っているために起こる:-)列聖されました
voretaq7

回答:


27

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

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

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


これらのファイルをキャッシュしないようにサーバーに指示することは可能ですか?sync; echo 3 > /proc/sys/vm/drop_cachesバックアップ後に実行する必要があると思いますか?

13
@ stan31337はい、可能です。いいえ、あなたはそうすべきではありません。このファイルをメモリに保存しても、費用はかかりません。すべてのキャッシュをクリアすると、キャッシュされてディスクから再度読み取る必要のあるファイルはすべて、システムの速度を低下させます。それがするように設計されたものをやらせてください。
ジェフファーランド

2
@ stan31337バックアップファイルを削除すると、OSは自動的にそれをキャッシュから追い出します(そのため、空きメモリが削除後に再びジャンプします)-Linuxは、開いていないファイルを開くことができないことを十分に認識していますファイルシステムツリーから到達することは二度とアクセスされません。ジェフが言ったように、FSキャッシュ全体をダンプしたくないことは間違いありません(システムはディスクからそのデータを再読み込みおよび再キャッシュするだけで、実際にはしばらくサーバーが遅くなります)
voretaq7

61

あなたは経験しているLinuxは私のラム食べた問題を。

パニックしないでください。

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

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

問題はOSではなく、問題は「空き」メモリとは何かを理解することです。


Unixシステムは、プログラムを実行するだけでなくメモリを使用します。メモリは次の用途に使用できます。

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

以下は、最新のUnixシステムがRAM使用量をどのように報告するかについての短い(そしてほとんど不完全な)ツアーです。

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

UnixシステムがRAMをFreeと報告している場合、「このRAMを何にも使用していない」という意味です。
空き RAMは事実上価値がありません-システムを高速化するのではなく、何かが必要な場合に備えて「空き」状態になっているだけです。それは、私が上記で言及した他の3つの項目のいずれかです。

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

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

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

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

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

アクティブメモリと同様に、非アクティブメモリは、アプリケーションが実行するあらゆる目的で使用するRAMです。違いは、このメモリがしばらくアクセスされていないため、OSがディスクにスワップアウトできると思い込んでプッシュするようになった場合、(少し運が良ければ)それを要求しないと主張するプログラムは、決して気付かないでしょう。

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

あなたと私が「使用済み」メモリと考えるものは、本質的には、アクティブメモリと非アクティブメモリの合計です。現在、アプリケーションが使用を要求しているすべてのRAM。
限り、あなたはより多くのアクティブおよび非アクティブメモリーの合計(プラストップの発言の512〜1024メガバイトの素敵な安全マージン)あなたはOKの場所にいるよりもRAMインストールされているよう:あなたのOSはおそらくスワップを打つとパフォーマンスを殺すことはありませんが。

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

あなたと私が「空き」メモリと考えるものは、プログラムを実行するために利用可能なメモリです。
これは、OSが報告する「無料」の数字よりも少し複雑です。プログラムがRAMを要求すると、オペレーティングシステムは次の方法で、RAMの破壊を最小限に抑えようとします。

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

ファイルを削除すると空きRAMが増えるのはなぜですか?

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


今では完全に明確になっています...私のLinuxの経験は2か月ほどで、すべてこのDebianサーバーで始まりました。1か月前、Gentooを自宅のラップトップにインストールしましたが、そのパフォーマンスに驚かされ、仕事用コンピューターでもWindowsユーザーからLinuxユーザーに完全に変わりました。GentooでLinuxを学ぶのは素晴らしいことですが、それでもまだ学ぶべきことがたくさんあります。

@ stan31337不明確なのはあなただけではありません-Windowsのバックグラウンドから来た人にとっては特に難しいです。なぜなら、それを掘り下げない限り、Windowsはこのレベルのメモリ使用量を報告しないからです)および「無料」(取得するプログラム用)。Macユーザーは、アクティビティモニターが基本的にグラフィカルバージョンであり、Free / Wired / Active / Inactive RAMを報告するため、少し簡単になりtopます。
-voretaq7

私は仕事に慣れプロセスエクスプローラ ... Windows上で、それはショーにメモリの多くのものを持っていましたが、それらのほとんどは、私が実際にそれらを見ていなかったことを、私にはそうは不明だった

2
また、Windowsでは通常、それほど詳細に表示されませんが、セットアップは非常に似ていることに注意してください。
ヨアヒムザウアー

ご存知のように、Windowsでもメモリの読み取りはわかりにくいです。これは、OSメーカーがより重視したいもの、あるいはユーザーが現在よりも気にする必要のないものです。
グレント

2

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

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

スラブキャッシュが「不足しているメモリ」の大部分を占める可能性がある場合は、/proc/slabinfoどこに行ったかを確認してください。歯またはiノードの場合はsync ; echo 2 > /proc/sys/vm/drop_caches、それらを使用して削除できます。

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

から:https : //stackoverflow.com/a/5467207

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