freeコマンドを使用すると、メモリ使用量と空き容量、およびキャッシュに使用されるメモリがどれくらいであるかを簡単に把握できます。実際のfreeコマンドは、Linux/proc/meminfoからメモリ情報を取得して表示します。それでは、freeコマンドで見ることができるメモリ情報とそれに関連するmeminfoの値を見てみましょう。
Linuxは常に空きメモリ領域をBufferとCacheとして使用しようとします。メモリにデータを保存することで、遅いディスクへのアクセスをできるだけ減らし、パフォーマンスを向上させます。
Bufferは、バッファキャッシュでデバイスブロックのメタデータをメモリにキャッシュしたサイズです。 ブロックデバイスからデータを読み取るために必要な情報をメモリに保存します。
Cacheは、ページキャッシュとslabとして使用されているメモリサイズです。
実際に約1Mサイズのファイルを生成してそれを読むと、cacheサイズが増加することがわかります。
ファイルを読み込む前のキャッシュサイズ
1Mサイズのファイルを読む
1M増加したキャッシュサイズ
CacheとBufferの間に最近使用されていないメモリサイズの詳細については、/proc/meminfoで確認できます。
上に見えるInactive(anon)とInactive(file)、SRelaimableが参照されてから古いスワップ領域に移動し、その領域を新しいメモリに割り当てることができるサイズです。
freeコマンドでこれらの値を参照してメモリにキャッシュされたデータのうちスワップ領域にアウトさせ、メモリを空にして新しい割り当てができる大きさをfreeコマンドのavailableとして示すものです。 availableはあくまでシステムで計算された予測サイズなので、この値にあまり依存してはいけません。
スワップは、ディスクの一定部分をメモリ領域不足時にメモリのように使用するために設定しておいた空間です。
カーネルは、メモリが不足している状況では、BufferとCacheに割り当てられているもののうち、頻繁に使用されていないものを空にしてメモリに割り当てようとします。 また、メモリ内のデータのうち、最近使用されていないデータをSWAP空間に移動します。(SWAP-OUT)
そして、SWAPに転送されたデータをプロセスが読み取るためにメモリにデータを取り戻します。(SWAP-IN) これはディスクから移動されたデータをメモリに戻すため、レイテンシが長くなり、最終的にパフォーマンスが低下します。
一時的なメモリ使用量の増加により、一定の SWAP を使用する状況と継続的なメモリ不足により SWAP が大きくなる場合を継続的にモニタリングし、メモリ増設のタイミングを考慮する必要があります。
ロードバランシングまたはワークロードを分散配置するプログラムは、/proc/meminfoを参照して、キャッシュ領域を空にしてどのくらいのメモリ割り当てが可能かについての情報も確認します。手動で命令を使用してキャッシュを空にすることもできます。ただし、キャッシュを適切に使用するとシステムのパフォーマンスが向上し、頻繁にキャッシュを空にするとパフォーマンスが低下する可能性があります。そのため、システムの特性に合わせてキャッシュのカーネルパラメータを適切に設定することについて考える必要があります。