結論からいうと、freeコマンドだけではメモリの利用状況を監視するには不十分です。これを理解するためにfreeコマンドの出力例を見てみましょう(図1)。
図中で「-/+ buffers/cache」という行の「used」と「free」に当たる部分は、それぞれ「used-」「free+」と呼ぶことにします。
それでは、各項目の意味について簡単に説明します。
行名 | 項目名 | 意味 |
---|---|---|
Mem | total | 総物理メモリ量 |
used | 総物理メモリ使用量からfreeを引いたもの | |
free | 何の用途にも使っていない物理メモリ量 | |
shared | 常に0。現在は利用されていない | |
buffers | ファイルなどのメタデータをキャッシュしている物理メモリ量 | |
cached | ファイルのデータ本体をキャッシュしている物理メモリ量 | |
-/+ buffers/cache | used- | buffers、cachedを含めないused量 |
free+ | buffers、cachedを含めたfree量 | |
Swap | total | Swap領域の総量 |
used | totalからfreeを引いた量 | |
free | 使用していないSwap領域の量 | |
Mem行のfree(MemFreeと呼ぶことにします)は「空きメモリ量」ではなく、何の用途にも使っていない物理メモリ量と考えてください。「MemFreeが少ない→空き物理メモリ量が少ない→利用可能な物理メモリ量が足りない」という発想を防ぐためです。この場合、単純に物理メモリを追加しても、いつかはMemFreeが少ない状況に落ちていくため、解決にはなりません。
システム全体のメモリ利用量の監視は、freeのみを判断基準とするのではなく、もっと総合的に「利用可能な物理メモリ量」を計算する必要があります。
システムが利用可能なメモリ量を計算するには、Linuxのページキャッシュの扱いを理解する必要があります。LinuxはHDDなどのストレージに保存してあるデータの読み出し/書き出し時に確保したメモリをページキャッシュという形で保持します。
CPU はストレージのデータを直接読むことはできません。そのため、ストレージデータはまずはメモリにロードする必要があります。Linuxでは、こうして読み込んだデータをページキャッシュとして再利用しています。いったん作成してしまえば、ページキャッシュは読み出し/書き出しにストレージを介さないため、非常に高速に動作します。
ページキャッシュは新たなストレージデータの読み出し/書き出し要求などがあってメモリが必要とならない限り、メモリを解放しません。そのため、通常はシステムが稼働しているだけでMemFreeはページキャッシュとして活用されていき、ある程度までは減り続けます。
このページキャッシュは、使用中でなくストレージとの内容の同期が取れていれば、すぐに捨てることが可能です。ページキャッシュに対する書き込みがあった場合には一時的に同期が取れていない状態になりますが、ストレージとの同期は定期的に行われており、時間さえたてば捨てられるようになります。つまり、ページキャッシュは「システムがほかの用途に再利用可能な」メモリを含んでいるのです。
以上より、MemFreeを監視すること自体には、あまり意味がないことがお分かりいただけたかと思います。
freeコマンドでも、ある程度ページキャッシュを意識した改良がされています。それがused-とfree+です。used-とfree+の位置付けを以下に示します(図3)。
buffersとcachedはページキャッシュです(注1)。そこで、freeコマンドはbuffersとcachedを足し合わせたものをusedから引いたり(used-)、freeに足したり(free+)して、より現実に近い物理メモリ使用量と利用可能な物理メモリ量を出力しています。freeコマンドで物理メモリ使用量を見る場合には、この値を参考にしてください。
とはいえ、システムが利用可能なメモリ使用量を把握するにはこれでは不十分です。先ほど、ページキャッシュをほかの用途に再利用するには「ストレージと同期している」ことが条件だと述べました。
buffersとcachedには当然ながら「ストレージと同期していない」ページキャッシュも含まれています(図4)。そのため、free+は本当に利用可能なメモリ量より多めに見積もってしまっていることになります。不等式にすると、以下のような感じになるでしょうか。
free <(実際に利用可能なメモリ量)< free+
freeコマンドではここまで絞り込むのが限界です。システム監視に当たって、この精度では困ります。つまり、「freeコマンドだけではメモリの利用状況を監視するには不十分」ということになります。
注1:正確にはbuffersとcachedにSwapCachedを足したものがページキャッシュの総量になりますが、freeコマンドではSwapCachedを意識できません。SwapCachedについては、次回以降の連載で少し触れる予定です。
Copyright © ITmedia, Inc. All Rights Reserved.