Linux / コマンド / free - メモリとスワップ使用量の確認

freeは、Linuxシステムの物理メモリ(RAM)とスワップの使用状況を要約して表示するコマンドです。メモリが不足しているかどうか判断する際には、名前通りのfree列よりも、新しいプログラムをスワップなしで開始できる量を推定したavailable列を優先的に確認するのが良いです。

free -h

Linuxは使用していないRAMをファイルキャッシュなどに活用し、必要に応じて回収します。したがって、freeの値が小さく、buff/cacheが大きいという事実だけでメモリ不足と判断してはいけません。

freeコマンドが表示する情報

freeはカーネルが提供する/proc/meminfoを読み込み、物理メモリとスワップの情報を計算します。各列の定義とオプションはprocps-ng free公式マニュアルで確認できます。

free -h

次はprocps-ng 3.3.17のマニュアルにある、used = total - free - buff/cacheという旧来の計算方式を説明するための出力例です。値は説明用です。現在のprocps-ngではused = total - availableで計算するため、同じ表示値から概算すると約5Giになります。実際の表示は丸められるため、厳密な比較には同じ単位の丸め前の値を使います。

               total        used        free      shared  buff/cache   available
Mem:            15Gi       4.2Gi       1.1Gi       320Mi       9.7Gi        10Gi
Swap:          2.0Gi       128Mi       1.9Gi

各列の意味を理解する

total, used, free

列 意味 解釈
total 使用可能な全物理メモリ 搭載されているRAMの全量と正確に同じではない場合があります。カーネルやハードウェアが予約した領域などが除外されます。
used 使用中またはすぐには使用できないメモリ 現在のprocps-ngでは物理メモリのtotal - availableとして計算されます。バージョンによって計算方法が異なる場合があります。
free いかなる用途にも使用されていないメモリ キャッシュとして使用中ですが回収可能なメモリは含まれません。

sharedとbuff/cache

sharedは主にtmpfsで使用されるメモリを示します。buff/cacheはカーネルバッファ、ページキャッシュおよび回収可能なスラブメモリを合計した値です。

キャッシュはディスクから読み込んだデータをRAMに残して再アクセスを高速化します。アプリケーションにメモリが必要な場合、カーネルが回収できるため、キャッシュが大きいという理由だけで問題があるわけではありません。

availableが重要な理由

availableはスワップを使用せずに新しいアプリケーションを起動するのに使えるメモリの推定値です。単にfree + buff/cacheを足した値ではなく、ページキャッシュや実際に回収可能なスラブの一部などを考慮したカーネルのMemAvailable情報を使用しています。

この値も将来のメモリ使用量を保証する絶対値ではありません。アプリケーションが突然大量のメモリを要求したり、カーネルが回収しにくいメモリが増えたりすると状況は急速に変化する可能性があります。

MemとSwap行の違い

物理メモリ行

Mem行は実際のRAMの全体サイズと使用状況をまとめています。アプリケーションメモリだけでなく、カーネル、キャッシュ、共有メモリなど多様な用途が含まれます。

スワップ行

SwapはRAMではなくスワップ領域の全体・使用・残量を表示します。スワップ使用量が0でないからといって、現在メモリ不足と断定することはできません。過去に押し出された非アクティブページがRAMに空きができた後もスワップに残ることがあるためです。

逆に、スワップ使用量が増え続け、vmstatのsiとsoが継続的に発生し、応答時間が悪化する場合はメモリ圧迫が疑われます。

vmstat 1

vmstatは表示を続けるため、Ctrl+Cで終了してから次のコマンドに進みます。現在の変化は最初の表示だけで判断せず、その後の更新行も観察してください。

よく使うオプション

人が読みやすい単位で表示する

free -h

-hまたは--humanは値に応じてKi、Mi、Giなどの二進単位を自動的に選択します。固定単位が必要な場合は-m、-gなどを使用できます。

free -m
free -g

バッファとキャッシュを分けて見る

free --wide

-wまたは--wideはbuff/cacheをbuffersとcache列に分けます。詳細な原因を分析するには/proc/meminfo、slabtopなども一緒に見る必要があります。

一定間隔で繰り返し表示する

free -h -s 2

-s 2は2秒間隔で結果を継続的に表示します。定められた回数だけ出力したい場合は-cを併用します。

free -h -s 2 -c 5

物理メモリとスワップの合計を見る

free -h --total

-tまたは--totalは列の合計を追加します。RAMとスワップは性能と役割が異なるため、合計のみを見て実際に使用可能な高速メモリとして解釈してはいけません。

メモリ不足を判断する方法

availableとスワップの入出力を一緒に見る

一度のfree出力よりも、次の信号を併せて観察することが望ましいです。

  • availableが通常よりも継続的に低下しているか
  • スワップ使用量が増加しているか
  • vmstatのsi・soが継続的に発生するかどうか
  • サービス応答時間とディスクI/Oが一緒に悪化しているか
  • カーネルログにOOM(Out of Memory)による終了記録があるか
free -h
vmstat 1
journalctl -k -g 'oom|Out of memory|Killed process'

journalctlの公式マニュアルによると、-gはPerl互換正規表現を使います。上の例の|は複数の検索語を選択する記号です。ここではカーネルログを調べており、ログ設定やアクセス権によって結果がない場合があります。ユーザー空間のサービスによるメモリ不足時の終了は、そのサービスのログも別途確認します。

メモリを多く使うプロセスを探す

psで常駐メモリ量を基準に並べ替えて上位のプロセスを確認できます。

ps -eo pid,user,%mem,rss,comm --sort=-rss | head

RSS(Resident Set Size)は現在物理メモリに載っているページの量を示しますが、共有ページが複数のプロセスに重複して計上されることがあります。コンテナ、共有ライブラリ、ファイルマッピングまで正確に分析するには、cgroup(プロセス群のリソース使用量と上限を管理する仕組み)の指標やsmemのようなツールも合わせて考慮してください。

キャッシュを無条件にクリアしない

ページキャッシュはシステムの性能を向上させるためにカーネルによって管理されます。表示上の空き容量を増やすだけの目的でキャッシュを強制的にクリアすると、ディスク読み込みが増えてかえって性能が低下する可能性があります。再現可能な性能テストのように明確な目的がある場合にのみ、影響と復旧方法を理解したうえで実施してください。

単位と自動化で注意すべき点

二進単位と十進単位

基本 -h 表示は1024を基準とする KiB、MiB、GiB 系列です。--si を使用すると1000を基準とする kB、MB、GB 系列を使用します。

free -h --si

ドキュメントやモニタリングで異なる単位を混ぜると差異が生じるため、基準を明示してください。

表示文字列をそのままパースしない

free の列と計算方法は procps-ng のバージョンによって異なる場合があり、人間が読みやすい単位はパースに適していません。自動化では可能であれば /proc/meminfo の必要な項目やモニタリングエージェントが提供する構造化された指標を使用し、単位とバージョンを固定してください。

コンテナで free の値が大きく見える理由

freeは/proc/meminfoを読み取ります。コンテナランタイムとcgroupの構成によって、このファイルはホスト全体のメモリに近い値を示すことがあり、実際にコンテナに適用されたメモリ制限とは異なる場合があります。

コンテナの利用可能容量を判断する際には、オーケストレーターのリクエスト・制限、cgroupのメモリ上限と現在の使用量、OOMイベントを合わせて確認してください。ホストのfreeの値だけでコンテナが使用できるメモリを断定しないことが重要です。

よくある質問

freeがほとんど0の場合、メモリが不足していますか?

必ずしもそうとは限りません。Linuxが余ったメモリをキャッシュとして使用すると、freeは小さくなることがあります。available、スワップ入出力、サービスのパフォーマンスも併せて確認してください。

buff/cacheはすべて解放できるメモリですか?

必要なときに一部を回収することはできますが、すべてを即座に回収できるわけではありません。availableはこうした差異を考慮した推定値であるため、buff/cache全体を単純に余裕メモリとして加えるのは避けたほうがよいです。

スワップを使用すると必ずRAMが不足していますか?

いいえ。過去の非アクティブページがスワップに残っている可能性があります。スワップ使用量の増加傾向や、実際のスワップ入出力と遅延が一緒に現れるかを確認する必要があります。

used 値はなぜ他のツールと異なって見えるのでしょうか?

ツールやバージョンごとにキャッシュ・回収可能メモリを分類する方法が異なる場合があります。同じ時点の/proc/meminfo、procps-ng バージョンと各ツールの定義を比較してください。

まとめ

free -hは、RAMとスワップの状況を素早く確認する基本コマンドです。メモリ不足かどうかは、free の1列だけでなく、available、スワップ入出力、プロセス使用量、サービスの遅延を一緒に見て判断する必要があります。

負荷も同時に高い場合は、uptime コマンドの平均負荷の解釈方法を参考に、CPUとI/Oのボトルネックも確認してください。