「freeコマンドの出力を見ても、どの数値が本当の空き容量なのかわからない」
Linuxのメモリ管理は、バッファやキャッシュの仕組みを理解しないと正しく読み解けません。freeの出力で「used」が高くても、実際にはキャッシュが大半を占めていて問題ないケースがほとんどです。
この記事では、Linuxのメモリの仕組みを基礎から解説し、freeコマンドの各項目の意味と正しい読み方を紹介します。
/proc/meminfoによる詳細確認、スワップの監視方法、メモリ不足時の対処法まで網羅します。
RHEL 9.4 / CentOS 7で動作確認済みの実行例付きです。
・free -h でメモリの使用状況を人間が読みやすい単位で確認できる
・available列が実質的な空きメモリ(buff/cache解放可能分を含む)
・/proc/meminfoでキャッシュ・スワップの内訳を詳細に把握できる
・スワップが常時発生するならメモリ増設を検討すべきサイン
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Linuxのメモリ管理の仕組み
Linuxは空きメモリを無駄にしないよう、使っていないメモリを積極的にキャッシュとして活用します。この仕組みを理解しないと「usedが90%を超えている。メモリが足りない」と誤解してしまいます。
1. 物理メモリ・バッファ・キャッシュの関係
Linuxのメモリは大きく次の3つに分類されます。・プロセスが使用中のメモリ:アプリケーションやサービスが確保している領域
・バッファ(buffers):ディスクI/Oを効率化するためにカーネルが確保する一時領域。ブロックデバイスのメタデータ(inode情報など)を保持する
・キャッシュ(cached):一度読み込んだファイルの内容をメモリ上に保持する領域。同じファイルへの再アクセスを高速化する
バッファとキャッシュは、プロセスがメモリを必要としたときにカーネルが自動で解放します。
つまり「used」が大きくても、その大半がバッファ・キャッシュであれば心配は不要です。
2. スワップ(Swap)とは
物理メモリが不足すると、カーネルは使用頻度の低いメモリページをディスク上のスワップ領域に退避させます。この動作を「スワップアウト」と呼びます。
スワップは物理メモリの不足を補う仕組みですが、ディスクI/Oが発生するためアクセス速度は物理メモリの数百倍~数千倍遅くなります。
スワップが頻繁に発生する状態は、サーバーのレスポンスが大幅に低下するサインです。
freeコマンドでメモリ使用状況を確認する
freeコマンドは、/proc/meminfoファイルの内容を人間が読みやすい形式で表示するコマンドです。1. freeコマンドの基本構文
# freeコマンドの基本構文 free [オプション]
・-h:人間が読みやすい単位(GB/MB)で表示する
・-m:メガバイト単位で表示する
・-g:ギガバイト単位で表示する
・-b:バイト単位で表示する
・-t:物理メモリとスワップの合計行を追加で表示する
・-s 秒数:指定した秒数ごとに繰り返し表示する
・-w:buffers と cache を別々の列に分けて表示する(CentOS 7以降)
2. freeコマンドを実行する
実際にサーバーでfreeコマンドを実行してみましょう。[pakira@Tiger ~]$ free total used free shared buff/cache available Mem: 2068376 399732 627888 11112 1040756 1487532 Swap: 2031608 0 2031608
・total:物理メモリの総容量
・used:使用中のメモリ容量(buff/cacheを含む計算の場合あり)
・free:完全に未使用のメモリ容量
・shared:主にtmpfsが使用している共有メモリ容量
・buff/cache:バッファとキャッシュの合計容量
・available:新しいプロセスに割り当て可能なメモリの推定値(スワップなしで使える量)
3. availableとfreeの違いを理解する
メモリの空きを確認するとき、free列ではなくavailable列を見ることが重要です。free列は「完全に何も使っていない」メモリだけを示します。
一方、available列は「バッファやキャッシュを解放すれば使える分」を含めた実質的な空き容量です。
上の実行例では、freeは627MBですがavailableは約1.4GBあります。
つまり、新しいプロセスを起動しても約1.4GB分のメモリをスワップなしで確保できます。
4. -hオプションで見やすく表示する
[pakira@Tiger ~]$ free -h total used free shared buff/cache available Mem: 2.0G 390M 613M 10M 992M 1.4G Swap: 1.9G 0B 1.9G
日常的なメモリ確認にはこの形式が最も実用的です。
5. -wオプションでbuffersとcacheを分離する
CentOS 7以降(procps-ng 3.3.10以降)では、-wオプションでbuffersとcacheを別々の列に表示できます。[pakira@Tiger ~]$ free -hw total used free shared buffers cache available Mem: 2.0G 390M 613M 10M 10M 982M 1.4G Swap: 1.9G 0B 1.9G
6. -sオプションで定期的に監視する
メモリを大量に消費するプロセスを実行しているとき、一定時間ごとにメモリの変化を監視できます。# 5秒ごとにメモリ使用状況を更新して表示する [pakira@Tiger ~]$ free -h -s 5 total used free shared buff/cache available Mem: 2.0G 390M 613M 10M 992M 1.4G Swap: 1.9G 0B 1.9G total used free shared buff/cache available Mem: 2.0G 392M 611M 10M 992M 1.4G Swap: 1.9G 0B 1.9G # Ctrl + C で停止
/proc/meminfoで詳細なメモリ情報を確認する
freeコマンドの情報元となっている /proc/meminfo を直接参照すると、さらに詳細なメモリ情報を取得できます。1. /proc/meminfoの主要な項目
[pakira@Tiger ~]$ cat /proc/meminfo MemTotal: 2068376 kB MemFree: 627888 kB MemAvailable: 1487532 kB Buffers: 11112 kB Cached: 1029644 kB SwapCached: 0 kB Active: 512348 kB Inactive: 789264 kB SwapTotal: 2031608 kB SwapFree: 2031608 kB Dirty: 12 kB Writeback: 0 kB AnonPages: 340728 kB Mapped: 98412 kB Shmem: 11112 kB Slab: 65432 kB SReclaimable: 48124 kB SUnreclaim: 17308 kB PageTables: 12544 kB CommitLimit: 3065796 kB Committed_AS: 1024768 kB VmallocTotal: 34359738367 kB VmallocUsed: 21504 kB HugePages_Total: 0 HugePages_Free: 0 Hugepagesize: 2048 kB
・MemTotal:物理メモリの総容量
・MemFree:完全に未使用のメモリ
・MemAvailable:新しいプロセスに割り当て可能な推定値
・Buffers:ブロックデバイスのバッファ領域
・Cached:ファイルキャッシュ領域
・SwapTotal / SwapFree:スワップ領域の総容量と空き容量
・Dirty:ディスクに書き戻す必要があるメモリ(この値が大きいとI/O負荷が高い)
・Active:最近アクセスされたメモリ(回収されにくい)
・Inactive:最近アクセスされていないメモリ(回収されやすい)
・Slab:カーネルが内部データ構造のために使用しているメモリ
2. MemAvailableの計算ロジック
MemAvailableは、Linux 3.14以降で追加された項目です。単純な「MemFree + Buffers + Cached」ではなく、カーネルが回収可能なスラブメモリ(SReclaimable)も加味して算出されます。
古いカーネルでMemAvailableが表示されない場合は、次の近似値で代用できます。
# MemAvailableがない環境での近似計算 MemFree + Buffers + Cached ≒ 利用可能メモリ
スワップの使用状況を監視する
1. freeコマンドでスワップを確認する
freeコマンドの出力には、Swap行が含まれています。[pakira@Tiger ~]$ free -h total used free shared buff/cache available Mem: 2.0G 390M 613M 10M 992M 1.4G Swap: 1.9G 0B 1.9G
この値が増え続けている場合は、物理メモリが不足しています。
2. vmstatでスワップの発生をリアルタイムで監視する
vmstatコマンドを使えば、スワップイン(si)・スワップアウト(so)の発生状況をリアルタイムで確認できます。[pakira@Tiger ~]$ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 627888 11112 1029644 0 0 2 5 18 32 1 0 99 0 0 0 0 0 627712 11112 1029644 0 0 0 0 15 28 0 0 100 0 0
si・soが継続的に0以外の値を示す場合は、メモリ不足の可能性が高いです。
vmstatコマンドの詳しい使い方は「vmstatコマンドでCPU・メモリの統計情報を確認する」を参照してください。
メモリを大量消費しているプロセスを特定する
メモリ不足が疑われるとき、どのプロセスがメモリを消費しているかを特定する必要があります。1. ps auxでメモリ使用率順に並べる
[root@Tiger ~]# ps aux --sort=-%mem | head -10 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND mysql 1423 0.1 8.2 1256948 170048 ? Sl Mar15 2:34 /usr/sbin/mysqld apache 2145 0.0 3.1 512340 64512 ? S Mar15 0:15 /usr/sbin/httpd root 1287 0.0 1.5 245632 31744 ? Ss Mar15 0:08 /usr/sbin/httpd root 1 0.0 0.3 193628 7168 ? Ss Mar15 0:05 /usr/lib/systemd/systemd
%MEM列がメモリ使用率、RSS列が実際に物理メモリ上で使用しているサイズ(KB)です。
psコマンドの詳しい使い方は「psコマンドでプロセスの詳細情報を確認する」を参照してください。
2. topコマンドでリアルタイムに確認する
topコマンドを起動して Shift + M を押すと、メモリ使用率の高い順に並び替わります。[root@Tiger ~]# top top - 14:23:15 up 21 days, 5:12, 1 user, load average: 0.08, 0.03, 0.05 Tasks: 142 total, 1 running, 141 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.7 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 2068376 total, 627888 free, 399732 used, 1040756 buff/cache KiB Swap: 2031608 total, 2031608 free, 0 used. 1487532 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1423 mysql 20 0 1256948 170048 12288 S 0.3 8.2 2:34.56 mysqld 2145 apache 20 0 512340 64512 38912 S 0.0 3.1 0:15.23 httpd
「avail Mem」の値がfreeコマンドのavailableと同じ意味です。
トラブルシュート:メモリ不足の対処法
1. 「Cannot allocate memory」エラーが出たとき
新しいプロセスの起動時に「Cannot allocate memory」が表示される場合、物理メモリとスワップの両方が枯渇しています。まず、free -h で現在の状態を確認してください。
[root@Tiger ~]# free -h total used free shared buff/cache available Mem: 2.0G 1.8G 32M 10M 120M 48M Swap: 1.9G 1.5G 400M
対処の手順は次のとおりです。
・手順1:ps aux --sort=-%mem でメモリ消費量の多いプロセスを特定する
・手順2:不要なプロセスがあれば kill コマンドで停止する
・手順3:一時的な対処として、手動でキャッシュをクリアする(下記参照)
・手順4:根本対処として、物理メモリの増設やスワップ領域の拡張を検討する
2. キャッシュを手動でクリアする(緊急時のみ)
通常はカーネルが自動でキャッシュを管理するため、手動クリアは不要です。ただし緊急時に一時的にメモリを確保する必要がある場合は、以下の方法があります。
# ページキャッシュのみクリア [root@Tiger ~]# sync; echo 1 > /proc/sys/vm/drop_caches # ページキャッシュ + dentries + inodes をクリア [root@Tiger ~]# sync; echo 3 > /proc/sys/vm/drop_caches
・1:ページキャッシュをクリア
・2:dentries と inodes をクリア
・3:ページキャッシュ + dentries + inodes をすべてクリア
この操作はデータを破壊しませんが、キャッシュがなくなるためクリア直後はディスクI/Oが増加します。
【注意】本番サーバーでの実行は慎重に判断してください。負荷の高い時間帯にキャッシュをクリアすると、一時的にディスクI/Oが急増してサービスに影響が出る場合があります。
3. スワップ領域を追加する
物理メモリの増設がすぐにできない場合、スワップファイルを追加して一時的にしのぐ方法があります。# 2GBのスワップファイルを作成する [root@Tiger ~]# dd if=/dev/zero of=/swapfile bs=1M count=2048 [root@Tiger ~]# chmod 600 /swapfile [root@Tiger ~]# mkswap /swapfile Setting up swapspace version 1, size = 2097148 KiB [root@Tiger ~]# swapon /swapfile # スワップが追加されたことを確認する [root@Tiger ~]# free -h total used free shared buff/cache available Mem: 2.0G 390M 613M 10M 992M 1.4G Swap: 3.9G 0B 3.9G
/swapfile swap swap defaults 0 0
本記事のまとめ
Linuxのメモリの仕組みとfreeコマンドの使い方を解説しました。| やりたいこと | コマンド |
|---|---|
| メモリ使用状況を確認する | free -h |
| buffersとcacheを分けて確認する | free -hw |
| メモリ状況を5秒ごとに監視する | free -h -s 5 |
| 詳細なメモリ情報を取得する | cat /proc/meminfo |
| スワップの発生を監視する | vmstat 5 |
| メモリ消費量の多いプロセスを特定する | ps aux --sort=-%mem | head |
| キャッシュを手動でクリアする | sync; echo 3 > /proc/sys/vm/drop_caches |
スワップのused値が増え続けている場合は、メモリ増設を検討するタイミングです。
メモリ管理、なんとなくで済ませていませんか?
freeコマンドの読み方ひとつで、サーバー障害の予兆を見逃すか早期に気づけるかが変わります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
