「freeの値がほぼゼロなのに、サーバーは普通に動いている。これって大丈夫なの?」
Linuxサーバーの運用で、メモリの状態をどう読み取ればよいのか迷った経験はないでしょうか。
この記事では、Linuxの
free コマンドを使ってメモリの使用状況を確認する実践的な手順を解説します。基本オプション(-h・-m・-g)の使い方から、出力の各列(total・used・free・buff/cache・available)の正しい読み方、「freeが少ないのにサーバーが正常」な理由、Swapの見方、OOM Killerへの対処、監視スクリプトでの活用まで、現場で必要な知識をまとめました。
freeコマンドとは? メモリの使用状況を一目で把握する基本コマンド
free は、物理メモリ(RAM)とスワップ領域の使用状況を表示するコマンドです。サーバーの動作が遅いと感じたとき、まず確認すべきはCPUとメモリです。
free コマンドを使えば、メモリがどれだけ使われていて、あとどれだけ余裕があるのかを一発で把握できます。# freeコマンドの実行(オプションなし) $ free total used free shared buff/cache available Mem: 4030976 1245312 328640 18432 2457024 2512640 Swap: 2097148 12288 2084860
-h オプションを付けるのが一般的です。freeコマンドの基本オプション
1. -h(人間が読みやすい単位で表示)
最もよく使うオプションです。値をK・M・G・Tなどの単位で自動的に表示してくれます。# 人間が読みやすい単位で表示 $ free -h total used free shared buff/cache available Mem: 3.8Gi 1.2Gi 321Mi 18Mi 2.3Gi 2.4Gi Swap: 2.0Gi 12Mi 2.0Gi
-h は「human-readable」の略です。現場では free -h を最初に実行するのが定番です。2. -m(メガバイト単位で表示)
値をMB単位に固定して表示します。数百MB~数GBクラスのメモリ搭載サーバーで使いやすいオプションです。# メガバイト単位で表示 $ free -m total used free shared buff/cache available Mem: 3936 1216 321 18 2399 2453 Swap: 2047 12 2035
-m のように単位を固定したほうが扱いやすくなります。3. -g(ギガバイト単位で表示)
値をGB単位に固定して表示します。16GBや64GBなど大容量メモリを搭載したサーバーでは、-g を使ったほうが見やすくなります。# ギガバイト単位で表示 $ free -g total used free shared buff/cache available Mem: 3 1 0 0 2 2 Swap: 1 0 1
-g は小数点以下が切り捨てられるため、正確な値が必要なときは -m や -h を使ってください。4. -t(物理メモリとSwapの合計行を追加)
-t を付けると、物理メモリとSwapを合算したTotal行が末尾に追加されます。# 物理メモリとSwapの合計行を追加 $ free -h -t total used free shared buff/cache available Mem: 3.8Gi 1.2Gi 321Mi 18Mi 2.3Gi 2.4Gi Swap: 2.0Gi 12Mi 2.0Gi Total: 5.8Gi 1.2Gi 2.3Gi
freeコマンドの各列の意味を正しく理解する
free の出力には6つの列があります。それぞれの意味を正確に把握しておくことが、メモリの状態を正しく判断する鍵になります。| 列名 | 意味 |
|---|---|
| total | 搭載されている物理メモリの総量 |
| used | 実際に使用中のメモリ量(buff/cacheを含む計算方法はカーネルバージョンによる) |
| free | 完全に未使用のメモリ量 |
| shared | tmpfs等で使われている共有メモリ量 |
| buff/cache | バッファとページキャッシュに使われているメモリ量 |
| available | 新しいプロセスに割り当て可能なメモリの推定量(最重要) |
この中で最も重要なのは available です。次のセクションで詳しく解説します。
「available」と「free」の違い~freeが少なくても慌てない~
Linuxのメモリを見るとき、多くの方が「free」の値だけを見て「メモリが足りない!」と焦ってしまいます。しかし、これは大きな誤解です。1. Linuxはメモリを積極的にキャッシュに使う設計
Linuxカーネルは、使っていないメモリをただ遊ばせておくのではなく、ディスクの読み書きを高速化するためのキャッシュに積極的に割り当てます。つまり、サーバーが長時間稼働していれば、freeの値がほぼゼロになるのは正常な動作です。メモリを有効活用している証拠であり、異常ではありません。
2. freeとavailableの違い
・free:完全に未使用のメモリ。何にも使われていない領域・available:新しいプロセスが起動したときに、実際に使えるメモリの推定量。キャッシュから回収できる分も含む
具体例で見てみましょう。
$ free -h total used free shared buff/cache available Mem: 15Gi 4.2Gi 312Mi 128Mi 11Gi 10Gi
free はわずか312MBしかありません。しかし available は10GBもあります。これは、11GBのbuff/cacheの大部分が必要に応じて解放できるためです。3. メモリが本当に不足しているかの判断基準
メモリの余裕を判断するときは、freeではなくavailableを見てください。・availableがtotalの20%以上 → 十分に余裕あり
・availableがtotalの10%前後 → やや注意。推移を監視する
・availableがtotalの5%以下 → 警戒レベル。プロセスの見直しやメモリ増設を検討
buff/cacheとは何か? バッファとキャッシュの正体
free の出力に表示される「buff/cache」は、カーネルがディスクI/Oを高速化するために使っているメモリ領域です。1. バッファ(buffer)
ブロックデバイス(ディスク)への書き込みを一時的に溜めておく領域です。データをまとめてディスクに書き込むことで、I/O効率を向上させます。通常は数十MB程度で、それほど大きくはなりません。2. ページキャッシュ(cache)
ディスクから読み込んだファイルの内容をメモリ上に保持しておく領域です。同じファイルに再度アクセスするとき、ディスクではなくメモリから読むため、劇的に高速化されます。buff/cacheは「使っていないメモリを有効活用している」だけなので、新しいプロセスがメモリを必要としたときは、カーネルが自動的にキャッシュを解放して空きを確保します。
※ 手動でキャッシュを解放することもできますが、通常は不要です。パフォーマンスが低下する原因になるため、安易に実行しないでください。
# キャッシュの手動解放(通常は実行不要) # ページキャッシュのみ解放 $ sudo sh -c "echo 1 > /proc/sys/vm/drop_caches" # ページキャッシュ + ディレクトリエントリ + iノードキャッシュを解放 $ sudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
Swapの見方~「Swapが使われている=即問題」ではない~
free の出力にはSwap行も表示されます。Swap(スワップ)とは、物理メモリが不足したときにディスク上の領域をメモリの代わりに使う仕組みです。1. Swapが少量使われているケース
Swapが数十MB~数百MB程度使われていて、availableに十分な余裕がある場合は、まず問題ありません。Linuxカーネルは、長時間アクセスされていないプロセスのメモリページを積極的にSwapに退避させます。これは物理メモリをより活発に使うプロセスやキャッシュに回すための最適化であり、正常な動作です。
2. Swapが大量に使われているケース
Swapの使用量がGB単位に達していて、かつavailableも少ない場合は、物理メモリが慢性的に不足しています。この状態では、頻繁にSwap領域との読み書き(スワッピング)が発生し、サーバーのパフォーマンスが大幅に低下します。# Swapの使用状況を確認 $ free -h total used free shared buff/cache available Mem: 3.8Gi 3.5Gi 48Mi 18Mi 280Mi 120Mi Swap: 2.0Gi 1.8Gi 200Mi # この例ではavailableがわずか120MBで、Swapも1.8GB使用 # → 物理メモリが完全に不足している状態
3. swappinessパラメータ
カーネルがどの程度積極的にSwapを使うかは、vm.swappiness パラメータで制御されています。# 現在のswappiness値を確認(デフォルトは60) $ cat /proc/sys/vm/swappiness 60 # 一時的に変更する場合(再起動すると元に戻る) $ sudo sysctl vm.swappiness=10 # 恒久的に変更する場合 $ sudo vi /etc/sysctl.conf # 以下の行を追加 vm.swappiness=10 $ sudo sysctl -p
free -s で定期的にメモリ状況を監視する
-s オプションを使うと、指定した秒数ごとに free の出力を繰り返し表示できます。メモリ使用量の推移をリアルタイムで確認したいときに便利です。# 5秒間隔でメモリ状況を表示(Ctrl+Cで停止) $ free -h -s 5 # 3秒間隔で5回だけ表示(-cオプションと組み合わせ) $ free -h -s 3 -c 5
-c(count)オプションを併用すれば、指定した回数だけ表示して自動的に終了します。負荷テスト中のメモリ推移を確認するときなどに重宝します。/proc/meminfo との関係
free コマンドが表示する情報は、実は /proc/meminfo ファイルから取得しています。/proc/meminfo にはより詳細なメモリ情報が含まれており、free はその中から主要な項目を抜き出して見やすく整形しているだけです。# /proc/meminfoの内容を確認(主要な行を抽出) $ grep -E "MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree" /proc/meminfo MemTotal: 4030976 kB MemFree: 328640 kB MemAvailable: 2512640 kB Buffers: 85024 kB Cached: 2286080 kB SwapTotal: 2097148 kB SwapFree: 2084860 kB
free コマンドの各列と /proc/meminfo の対応関係は以下のとおりです。| freeの列 | /proc/meminfoの項目 |
|---|---|
| total | MemTotal |
| free | MemFree |
| available | MemAvailable |
| buff/cache | Buffers + Cached |
スクリプトで特定のメモリ情報だけを取得したい場合は、
/proc/meminfo を直接参照するほうが効率的です。vmstat・topとの使い分け
メモリの確認に使えるコマンドはfree 以外にもあります。目的に応じて使い分けましょう。| コマンド | 得意な場面 |
|---|---|
free -h |
メモリ全体の使用状況をサッと確認したいとき |
vmstat 1 |
メモリ・CPU・I/Oの推移を秒単位でリアルタイム監視したいとき |
top(またはhtop) |
どのプロセスがメモリを大量に消費しているか特定したいとき |
vmstatでの確認例
# 1秒間隔でメモリ・CPU・I/Oの推移を表示 $ vmstat 1 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 12288 328640 85024 2286080 0 0 5 12 120 210 3 1 96 0 0 0 0 12288 326400 85024 2286080 0 0 0 0 115 198 2 1 97 0 0
vmstat の si(swap in)と so(swap out)の値が継続的に大きい場合は、メモリ不足でスワッピングが頻発していることを示しています。topでメモリ消費の多いプロセスを特定
# topを起動してメモリ使用率順にソート # top起動後、Shift + M でメモリ使用率順に並び替え $ top
top の %MEM 列を見れば、どのプロセスがメモリを多く消費しているかが一目でわかります。メモリ不足の原因となっているプロセスを特定するのに最適です。トラブルシュート:メモリ不足時の対処
1. メモリを大量消費しているプロセスを特定する
まずは、どのプロセスがメモリを圧迫しているかを確認します。# メモリ使用量の多い順にプロセスを表示(上位10件) $ ps aux --sort=-%mem | head -11 # 特定のプロセスのメモリ使用量を確認 $ ps aux | grep httpd
2. OOM Killer(Out of Memory Killer)とは
Linuxカーネルには、物理メモリとSwapの両方が枯渇した場合に、メモリを大量消費しているプロセスを強制終了する OOM Killer(Out of Memory Killer)という仕組みがあります。OOM Killerが発動すると、システムログに記録が残ります。
# OOM Killerの発動履歴を確認 $ sudo grep -i "out of memory" /var/log/messages # RHEL8/9・CentOS Stream等(journalctlの場合) $ sudo journalctl -k | grep -i "out of memory" # どのプロセスがkillされたか確認 $ sudo dmesg | grep -i "killed process"
・メモリの増設:物理的にメモリを追加する(仮想環境ならリソース割り当ての見直し)
・プロセスの設定見直し:Apache/Nginxのワーカー数やMySQLのバッファサイズを適正値に調整
・不要なサービスの停止:使っていないデーモンを停止してメモリを確保
3. 特定のプロセスをOOM Killerの対象から外す
データベースなど、絶対に強制終了させたくないプロセスには、oom_score_adj を設定してOOM Killerの優先度を下げることができます。# プロセスのOOMスコアを確認(値が大きいほど優先的にkillされる) $ cat /proc/(プロセスID)/oom_score # OOM Killerの対象から完全に除外する(-1000が最小値) $ sudo echo -1000 > /proc/(プロセスID)/oom_score_adj
実務Tips:メモリ使用率の計算とスクリプト活用
1. メモリ使用率の計算式
メモリの使用率を計算するとき、「何を基準にするか」が重要です。現場では以下の計算式が一般的です。メモリ使用率(%)= (total - available) / total * 100
used / total で計算する方法もありますが、buff/cacheの扱いが曖昧になるため、available を使った計算式のほうが実態に即しています。2. ワンライナーでメモリ使用率を計算
# メモリ使用率をパーセントで表示 $ free -m | awk '/Mem:/ {printf "メモリ使用率: %.1f%%\n", ($2-$7)/$2*100}' メモリ使用率: 37.6%
3. 監視スクリプトの例
メモリ使用率が閾値を超えたらメールで通知する、シンプルな監視スクリプトの例です。#!/bin/bash # メモリ使用率の監視スクリプト THRESHOLD=80 MAILTO="admin@example.com" HOSTNAME=$(hostname) # availableベースでメモリ使用率を計算 USAGE=$(free -m | awk '/Mem:/ {printf "%.0f", ($2-$7)/$2*100}') if [ "$USAGE" -ge "$THRESHOLD" ]; then echo "${HOSTNAME}: メモリ使用率が${USAGE}%に達しました" | \ mail -s "[警告] ${HOSTNAME} メモリ使用率 ${USAGE}%" "$MAILTO" fi
# crontabに登録(5分ごとに実行) */5 * * * * /usr/local/bin/memory_check.sh
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| メモリ状況を見やすい単位で確認する | free -h |
| MB単位で固定して確認する | free -m |
| GB単位で固定して確認する | free -g |
| 物理メモリとSwapの合計を表示する | free -h -t |
| 5秒間隔でメモリ推移を監視する | free -h -s 5 |
| 詳細なメモリ情報を確認する | grep -E "MemTotal|MemFree|MemAvailable" /proc/meminfo |
| メモリ使用率をワンライナーで計算する | free -m | awk '/Mem:/ {printf "%.1f%%\n", ($2-$7)/$2*100}' |
| メモリ消費の多いプロセスを特定する | ps aux --sort=-%mem | head -11 |
| OOM Killerの発動履歴を確認する | sudo dmesg | grep -i "killed process" |
| Swapの積極度を確認する | cat /proc/sys/vm/swappiness |
freeコマンドの出力を正しく読めていますか?
メモリの管理は、サーバー運用の基本中の基本です。freeの値に惑わされず、availableで判断する正しい見方を身につけましょう。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・pstree
・chsh
・finger
・duコマンドでディスク使用量を確認する方法|ディレクトリごとの容量や容量順ソートも
・LinuxのOSバージョンを確認するコマンド|uname・os-release・hostnamectlの使い方
