LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルサーバーの運用やトラブルシューティングにおいて、「現在どれくらいメモリが使われているのか」「新しいアプリケーションを起動できる空きメモリは残っているのか」を確認したい場面は頻繁にあります。
この記事では、Linuxシステムの物理メモリ(RAMRAM [ラム]Random Access Memory。データを一時的に記憶する揮発性の主記憶装置)とスワップ領域の使用状況・空き容量を表示する free コマンドの使い方を解説します。出力される各列(total・used・free・buff/cache・available)の正確な意味や、「free 列が少ないのにメモリ不足ではない理由」、実務でよく使うオプションまでを具体例とともに紹介します。
この記事を読むことで、free コマンドの出力結果を正しく読み解き、サーバーのメモリ余裕度を正確に判断できるようになります。
確認した環境
本記事で解説するコマンドや出力結果は、以下の環境で実機検証を行っています(バージョン確認コマンド: free --version)。
| OSOS [オーエス]Operating System。基本ソフトウェア | procps-ng バージョン |
|---|---|
| DebianDebian [デビアン]コミュニティ主導で開発される安定性の高いLinuxディストリビューション GNU/Linux 11 (bullseye) | procps-ng 3.3.17(free from procps-ng 3.3.17) |
| AlmaLinux 9.4 | procps-ng 3.3.17(free from procps-ng 3.3.17) |
| UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTS | procps-ng 4.0.4(free from procps-ng 4.0.4) |
※ 記事内の出力例は Debian GNU/Linux 11(procps-ng 3.3.17)で取得したものです。procps-ng 4.0.1 以降の環境では used 列の計算式が異なるため、数値の内訳が変わります(詳細は後述)。
Linuxのfreeコマンドとは?メモリ状況を確認する基本機能
free コマンドは、Linuxシステムにおける物理メモリ(RAM)およびスワップメモリ(Swap)の合計容量・使用量・空き容量を表示するコマンドです。プロセスの監視ツール群である procps(または procps-ng)パッケージに含まれており、ほぼすべてのLinuxディストリビューションに標準でインストールされています。
内部的にはカーネルが公開している /proc/meminfo ファイルの情報を読み取り、人間が把握しやすい表形式に整理して出力します。
基本構文とデフォルトの実行結果
free コマンドの基本構文は以下の通りです。
free [オプション]オプションを指定せずに free を実行すると、デフォルトでは キビバイト(KiB=1,024バイト単位) でメモリの状態が表示されます。
$ free total used free shared buff/cache availableMem: 999028 403796 97064 416 498168 453292Swap: 0 0 0出力の行(縦方向)は、以下の2種類に分かれています。
Mem:行: 物理メモリ(RAM)の使用状況を示します。Swap:行: スワップ領域(物理メモリが不足した際にディスク上へ退避する領域)の使用状況を示します。スワップが設定されていない環境ではすべて0と表示されます。
他のメモリ関連コマンド(top・vmstat・lsmem)との使い分け
Linuxには free 以外にもメモリ情報を確認できるコマンドが複数あります。目的に応じて以下のように使い分けるのが効果的です。
| コマンド | 主な確認対象・特徴 | 向いている用途 |
|---|---|---|
| free | システム全体の物理メモリ・スワップの容量と空き状況を一瞬で表示 | 現在のメモリ使用量や空き容量(available)を手早く把握したいとき |
| top | CPUCPU [シーピーユー]Central Processing Unit。コンピュータの頭脳となる中央演算処理装置やメモリの使用状況をプロセス単位でリアルタイムに一覧表示 | どのプロセスがメモリを大量に消費しているか特定したいとき |
| vmstat | メモリに加え、スワップイン(si)・スワップアウト(so)やI/O待ちを集計表示 | スワップ発生の有無やシステム全体のボトルネックを時系列で追いたいとき |
| lsmem | メモリブロックの物理アドレス範囲やオンライン/オフライン状態を表示 | OSが認識している物理メモリのハードウェア構成を確認したいとき |
まずは free コマンドでシステム全体のメモリ余裕度を確認し、メモリ使用量が多い場合は topコマンド で原因プロセスを調べたり、vmstatコマンド でスワップの発生状況を確認したりする流れが一般的です。また、物理メモリブロックの構成を確認したい場合は lsmemコマンド を使用します。
freeコマンドの出力結果の見方|freeとavailableの決定的な違い
free コマンドの出力で最も重要なポイントは、「空きメモリを確認するときは free 列ではなく available 列を見る」 という点です。それぞれの列が表す意味と、/proc/meminfo との対応関係を整理します。
各列(total・used・free・shared・buff/cache・available)の意味
出力される6つの列(-w オプション使用時は7列)の意味は以下の通りです。
| 列名 | 意味 | /proc/meminfo の対応項目・計算式 |
|---|---|---|
| total | システムが利用できる物理メモリ(またはスワップ)の合計容量 | MemTotal / SwapTotal |
| used | 使用中または利用不可のメモリ量。物理メモリ(Mem: 行)は procps-ng のバージョンにより計算式が異なります(後述)。スワップ(Swap: 行)は SwapTotal - SwapFree で計算されます | Mem: 行(3.3.10 〜 4.0.0): total - free - buffers - cache / Mem: 行(4.0.1 以降): total - available / Swap: 行: SwapTotal - SwapFree |
| free | どのプロセスにもキャッシュにも使われていない完全な未使用メモリ | MemFree / SwapFree |
| shared | 主に tmpfs(メモリ上のファイルシステム)や共有メモリで使用されている容量 | Shmem |
| buff/cachecache [キャッシュ]データを一時的に保存しアクセスを高速化する仕組み | カーネルのバッファ(buffers)とページキャッシュ・Slab(cache)の合計量 | Buffers + Cached + SReclaimable |
| available | スワップを発生させずに新規アプリケーションへ割り当て可能な推定メモリ量 | MemAvailable |
※ shared は buff/cache と一部のメモリ領域(tmpfs や共有メモリなど)が重複します。そのため、各列の数値を単純に足し合わせて物理メモリの使用量を算出することはできません。
なぜ「free」が少なくても問題ないのか?(buff/cacheの仕組み)
Linuxのメモリ管理には、「空いている物理メモリがあれば、ディスクから読み書きしたデータのキャッシュ(buff/cache)として積極的に活用し、I/O処理を高速化する」という特徴があります。
そのため、長期間稼働しているLinuxサーバーでは buff/cache が増え、完全な未使用領域である free 列の数値は非常に小さくなるのが通常の動作です。
この buff/cache に使われているメモリの多くは、アプリケーションが新しくメモリを必要とした際にカーネルが自動的に解放して割り当てることができます。したがって、free 列の数値が小さいからといって、すぐにメモリ不足だと判断する必要はありません。
実質的な空き容量は「available」列で判断する
実際に新しいプロセスやアプリケーションが利用できるメモリの余裕度を知りたい場合は、右端の available 列を確認します。
available(/proc/meminfo の MemAvailable)は、完全な未使用メモリ(free)に加えて、ページキャッシュや回収可能なカーネルメモリなどを考慮し、スワップを発生させずに新しいアプリケーションへ割り当てられるメモリ量を推定した値です。
ただし、すべてのキャッシュや回収可能なメモリを解放できるわけではなく、カーネルが一定のメモリを維持する必要もあるため、単純な解放可能メモリの合計ではありません。
実務での目安として、以下の2点を確認するとメモリの健康状態を把握できます。
Mem:行のavailableがtotalに対して十分に残っているかSwap:行のusedが増加していないかを確認する。ただし、スワップ領域が使用されていても、現在スワップI/Oが発生しているとは限りません。継続的なスワップイン・スワップアウトが発生しているか確認する場合は、vmstatコマンドのsi・soを併せて確認します。
注意点:procps-ngのバージョンによる「used」列の計算式の違い
ディストリビューション間で free コマンドの出力を比較する際、procps-ng のバージョンによって物理メモリ(Mem: 行)の used 列の計算式が異なる点に注意が必要です。
※ 以下の計算式は物理メモリ(Mem: 行)に対するものです。Swap: 行の used は、バージョンにかかわらず SwapTotal - SwapFree で算出されます。
- procps-ng 3.3.10 〜 4.0.0(Debian 11 / AlmaLinux 9 など):
used = total - free - buffers - cacheで計算されます。この場合、totalの内訳がused + free + buff/cacheと一致します。 - procps-ng 4.0.1 以降(Ubuntu 24.04 LTS / Debian 12 など):
used = total - availableで計算されるように仕様が変更されました。この変更により、usedは単純なメモリ使用量ではなく、availableとして見積もられた利用可能メモリを除いた「使用中または利用不可のメモリ量」を表すようになりました(そのためused + free + buff/cacheの合計はtotalと一致しません)。 そのため、従来のバージョンと比較すると、同じシステム状態でもusedの値が異なる場合があります。また、実際のアプリケーションのメモリ消費量を直接示す値ではない点に注意してください。
監視スクリプトなどで free コマンドの出力から実質的なメモリ使用率(%)を計算する場合は、used 列に依存するよりも、第2列の total($2)と第7列の available($7)を使って (total - available) / total として算出するほうが、OSバージョン間の差異を受けにくく安全です。以下は、awkコマンドのprint処理と組み合わせて実質メモリ使用率を出力する例です(※ -w オプションを付けない標準の列構成を前提としています。-w 併用時は available が $8 になります)。
# total($2)とavailable($7)から実質的なメモリ使用率(%)を計算する$ LC_ALL=C free -b | awk '/^Mem:/ {printf "Used: %.1f%%\n", ($2 - $7) / $2 * 100}'Used: 55.7%【目的別】freeコマンドの主要オプションと実践的な使い方
free コマンドには、表示単位の切り替えや定期的な出力を行うためのオプションが用意されています。実務でよく使うオプションは以下の通りです。
| オプション | 長い形式 | 役割 |
|---|---|---|
-h | --human | 人間が読みやすい単位(Ki, Mi, Gi など)へ自動変換して表示する |
-b / -k / -m / -g | --bytes / --kibi / --mebi / --gibi | 1,024の累乗(2進接頭辞)で指定した単位(B / KiB / MiB / GiB)で表示する |
--kilo / --mega / --giga | - | 1,000の累乗(10進SI接頭辞: kB / MB / GB)で表示する(--si が暗黙的に有効になる) |
-w | --wide | buff/cache を buffers と cache の2列に分割してワイド表示する |
-t | --total | 物理メモリ(Mem:)とスワップ(Swap:)の合計行(Total:)を追加表示する |
-s <秒数> | --seconds <秒数> | 指定した秒数間隔で継続的に繰り返し出力する |
-c <回数> | --count <回数> | -s と併用し、指定した回数だけ出力して終了する |
人間が読みやすい単位に自動変換して表示する(-h)
日常的なサーバー確認で最もよく使われるのが -h(--human)オプションです。値の大きさに応じて B、Ki(キビバイト)、Mi(メビバイト)、Gi(ギビバイト)などの単位記号が自動で付与されます。
$ free -h total used free shared buff/cache availableMem: 975Mi 394Mi 94Mi 0.0Ki 486Mi 442MiSwap: 0B 0B 0B桁数の多い数値を一目で把握できるため、対話的なターミナル操作では free -h を使うのが基本です。
単位を固定して数値のみを表示する(-m・-g・-b・—mega)
スクリプトで数値を集計したり、複数サーバーの数値を同じ単位で比較したりする場合は、単位を固定するオプションを使用します。単位固定オプションでは数値の後ろに Mi などの単位文字列が付かないため、awk などで扱いやすくなります。
# メビバイト(MiB = 1,024 × 1,024 バイト)単位で表示する$ free -m total used free shared buff/cache availableMem: 975 401 68 0 505 435Swap: 0 0 0
# バイト(Bytes)単位で正確な数値を表示する$ free -b total used free shared buff/cache availableMem: 1023004672 420802560 72003584 425984 530198528 456650752Swap: 0 0 0なお、-g(ギビバイト単位)を指定すると、1GiB未満の項目は端数が切り捨てられて 0 と表示されるため、数GB程度のメモリ環境では -m のほうが細かい変化を確認できます。
また、-m や -g は 1,024の累乗(2進接頭辞: MiB / GiB) で計算されます。ハードウェア仕様書などで使われる 1,000の累乗(10進SI接頭辞: MB / GB) で表示したい場合は、--mega や --giga(または -h --si)を指定します。
# メガバイト(MB = 1,000 × 1,000 バイト)単位で表示する$ free --mega total used free shared buff/cache availableMem: 1023 420 72 0 530 456Swap: 0 0 0buffersとcacheを別々の列に分けて表示する(-w)
デフォルトの出力では、カーネルバッファとページキャッシュが合算されて buff/cache の1列にまとめられています。これらを buffers 列と cache 列の2つに分けて個別に確認したい場合は、-w(--wide)オプションを指定します。
$ free -w total used free shared buffers cache availableMem: 999028 404608 96252 416 23468 474700 452480Swap: 0 0 0それぞれの内訳は以下の通りです。
buffers: ブロックデバイス(ディスクのメタデータなど)の一時的なバッファ領域(/proc/meminfoのBuffers)。cache: ファイルの内容を保持するページキャッシュと、カーネルオブジェクトのキャッシュのうち再利用可能な領域の合計(/proc/meminfoのCached + SReclaimable)。
-w と -h を組み合わせて free -hw のように実行することも可能です。
物理メモリとスワップの合計行を表示する(-t)
-t(--total)オプションを指定すると、出力の最下部に Mem: 行と Swap: 行を縦に足し合わせた Total: 行が追加されます。
$ free -t total used free shared buff/cache availableMem: 999028 404332 96528 416 498168 452756Swap: 0 0 0Total: 999028 404332 96528物理メモリとスワップを合わせた総メモリ容量・総使用量を確認したい場合に利用します。
一定間隔でメモリ使用量を継続的にモニタリングする(-s・-c)
バッチ処理の実行中や負荷テスト中にメモリ使用量の推移を追いかけたい場合は、-s <秒数>(--seconds <秒数>)オプションを使います。さらに -c <回数>(--count <回数>)を組み合わせると、指定した回数だけ出力した後に自動でコマンドが終了します。
# 1秒間隔で2回だけ、人間が読みやすい単位(-h)で出力する$ free -h -s 1 -c 2 total used free shared buff/cache availableMem: 975Mi 401Mi 68Mi 0.0Ki 505Mi 435MiSwap: 0B 0B 0B
total used free shared buff/cache availableMem: 975Mi 401Mi 68Mi 0.0Ki 505Mi 435MiSwap: 0B 0B 0B-c を指定せずに free -h -s 5 のように実行した場合は、5秒おきに出力が追記され続けます。終了するときは Ctrl + C を押します。
なお、画面をスクロールさせずに同じ位置で表示を更新し続けたい場合や、数値が変化した箇所をハイライト表示したい場合は、watchコマンドと組み合わせて watch -d free -h を実行する方法も便利です。
まとめ:freeコマンドでは「available」を基準にメモリ余裕度を判断しよう
本記事では、Linuxの free コマンドによるメモリ使用量・空き容量の確認方法について解説しました。
記事の要点を以下にまとめます。
freeコマンドは/proc/meminfoの情報を基に、物理メモリ(Mem:)とスワップ(Swap:)の状況を一覧表示する。- Linuxは空きメモリをディスクキャッシュ(
buff/cache)として活用するため、free列の数値が小さくても直ちにメモリ不足とは限らない。 - 新規アプリケーションに割り当て可能な実質的な空き容量は、右端の
available列で確認する。 - 日常の確認には単位を自動変換する
free -h、スクリプト処理や比較には単位を固定するfree -mやfree -bを使い分ける。 buffersとcacheを分けて見たいときは-w、一定間隔で推移を監視したいときは-s <秒数>と-c <回数>を活用する。
サーバーのメモリ状況を調査する際は、まず free -h で available の余裕度とスワップの使用有無を確認し、必要に応じて top や vmstat による詳細調査へと進めてみてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。