これは、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のメモリグラフはcacheとbuffersをバックアップ前の状態に戻します。
Muninグラフは次のとおりです:
外部でホストされた画像はリンク切れでした。
これは サーバーがスワップパーティションの使用を拒否する と同じ "問題"であり、このサイトの他のいくつかの同様の質問です。 ( Linuxサーバーでの高メモリ使用量 、 LINUXでのメモリ使用量 、 メモリが不足しているWebサーバー など)
メモリの消費量がcacheであることに注意してください。これは、ファイルをメモリに保持していることを意味します。キャッシュされたメモリは「空き」メモリです。メモリのブロックを空のままにする代わりに、OSは最近読み取ったファイルをそのスペースに保持します。アプリケーションがそのメモリを必要とする場合、そのメモリはアプリケーションによって使用されます。それまでは、ファイルが頻繁に参照される場合に、ディスクからファイルを再度読み取る必要がないようにするチャンスです。
このグラフによると、グラフの期間全体で、効果的なメモリ消費量はまったく変化していません。
Linux Ate My Ram の問題が発生しています。
問題はお使いのOSではありません-問題は、「空き」メモリとは何かについての理解です。
Unixシステムは、単にプログラムを実行する以上の目的でメモリを使用します。メモリは次の目的で使用されます。
以下は、最近のUnixシステムがRAMの使用状況を報告する方法の簡単な(そして大部分は不完全な)ツアーです。
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を取得しようとします。
malloc()
は失敗します。これはPOSIX準拠の動作です。オペレーティングシステムは、プログラムがRAMを要求しているため、要求を満たすことができないことを通知します。ここの質問の例では、バックアップファイルを削除することでRAMを「解放」できることに気付きました。その説明は非常に単純です。そのファイルを使用しているものがないため(開いているファイルハンドルがないため)また、ファイルシステムからアクセスできなくなった(リンク解除された)OSは、そのデータに再びアクセスする人がいないことを認識し、ファイルシステムキャッシュからデータを削除します。
これにより、OSはより多くの空きメモリを報告しますが、システムのパフォーマンスには影響しません。
上記が失敗するかどうかを確認するための何か:
スラブキャッシュの使用状況を確認してください(
Slab:
のSReclaimable:
、SUnreclaim:
および/proc/meminfo
)。これはカーネル内のデータ構造のキャッシュであり、free
によって報告されるページキャッシュとは別のものです。「メモリ不足」の大部分がスラブキャッシュの原因である可能性がある場合は、
/proc/slabinfo
をチェックして、どこになくなったかを確認してください。 dentriesまたはinodeの場合は、sync ; echo 2 > /proc/sys/vm/drop_caches
を使用してそれらを取り除くことができます。
slabtop
ツールを使用して、スラブキャッシュの現在の使用状況をわかりやすい形式で表示することもできます。c
は、現在のキャッシュサイズでリストを並べ替えます。