メモリ不足は、スワップの多用による応答遅延から始まり、最終的にはOOM Killerによるプロセス強制終了やシステムフリーズへと進行します。しかも厄介なのは、じわじわと進行するため、気づいたときには手遅れになりやすい点です。
この記事では、free / vmstat / /proc/meminfo の3つのコマンドを組み合わせて、メモリ不足を本番障害になる前に早期発見するための監視設計を解説します。コマンドの使い方だけでなく、「どの指標を、どの閾値で、どう監視するか」という設計思想まで踏み込みます。
動作確認環境:RHEL 9.4 / Ubuntu 24.04 LTS
この記事のポイント
・free / vmstat / /proc/meminfo を組み合わせて多面的に検出できる
・スワップ使用開始(si/so が正値継続)が本番障害の最初のサイン
・MemAvailable を閾値基準にすると正確な空き容量を把握できる
・cron とシェルスクリプトで閾値アラートを自動監視できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
Linuxサーバーのメモリ不足が引き起こす障害パターン
メモリ不足による障害は、大きく3段階で進行するケースがほとんどです。
・第1段階 — スワップへのページアウト:物理メモリが逼迫すると、カーネルは使用頻度の低いメモリページをスワップ(ディスク上)に退避し始めます。ディスクI/Oが増大するため応答速度が数倍遅くなります。
・第2段階 — OOM Killer の発動:スワップも枯渇すると、カーネルはOOM(Out Of Memory)Killerを発動して、スコアが最も高いプロセスを強制終了します。Webサーバーやデータベースが狙われると即時サービス停止です。
・第3段階 — システムフリーズ:OOM Killerが追いつかない場合、システム全体がフリーズするケースもあります。この状態になると再起動以外の手段がありません。
重要なのは、第1段階(スワップ開始)の段階で検知して対処できるか否かで、障害の深刻度が大きく変わる点です。監視設計の目標は、この第1段階を見逃さないことです。
freeコマンドで現状のメモリ使用量を把握する
1. freeコマンドの基本構文と出力の読み方
まず手動確認の起点として、free コマンドの出力を正確に読めるようにしましょう。
# -h オプションで人間が読みやすい単位(GB/MB)で表示 $ free -h total used free shared buff/cache available Mem: 7.7G 4.3G 487M 278M 2.9G 2.9G Swap: 2.0G 198M 1.8G
出力の各列の意味は次のとおりです。
・total:搭載されている物理メモリの合計
・used:現在使用中のメモリ(buff/cache を含む)
・free:一切使われていないメモリ(通常は小さい値になる)
・buff/cache:バッファとページキャッシュが使用中のメモリ
・available:新しいプロセスが実際に使えるメモリの推計値
2. available列を重視する理由
初心者が陥りやすい誤りが「free の値が少ないから危険」という判断です。Linuxカーネルはディスクアクセスを高速化するために、空きメモリをキャッシュとして積極的に活用します。そのため、free が少なくても available が十分あれば問題ありません。
監視で見るべき数値は「available」です。available が total の 20% を下回り始めたら要注意ラインです。さらに 10% を割り込んだら、OOM Killer 発動のリスクが高まります。
vmstatでメモリスワップとI/Oの傾向を時系列で掴む
1. vmstatの基本的な監視パターン
vmstat は一定間隔でシステム統計を継続出力できます。リアルタイムでメモリ・スワップ・CPU・I/O の傾向を同時に観察できるのが強みです。
# 5秒間隔で10回サンプリング(最初の行はブート来の累計値のため読み飛ばす) [web01]$ vmstat 5 10 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 28672 51200 19456 2967552 0 0 3 18 301 641 24 3 72 1 0 2 0 28672 47360 19456 2967552 4 8 38 26 335 712 38 5 56 1 0 3 1 32768 41984 19456 2965504 12 18 72 44 421 889 52 8 38 2 0 2 1 36864 35840 19456 2963456 22 28 112 58 512 1024 61 11 26 2 0
2. swapinとswapoutでメモリ逼迫を判断する
vmstat の出力でメモリ監視の要となるのが ---swap-- 列の si(swap in)と so(swap out)です。
・si(swap in):スワップからメモリへのページイン。ディスクから読み込んでいる量(KB/s)
・so(swap out):メモリからスワップへのページアウト。ディスクへ書き出している量(KB/s)
si/so がどちらも継続して 0 以外の値を示している場合、メモリが慢性的に逼迫しています。一時的なスパイクは問題ありませんが、複数回のサンプルで常に so が正の値を示すようなら監視アラートを上げるべき状態です。
Linuxサーバーの監視・障害対応を現場レベルで学ぶ
vmstat の読み方からカーネルパラメータ調整まで、独学では体系的に学びにくい領域を2日間のハンズオンで習得。3,100名以上の現役エンジニアが受講した実践型セミナーです。
/proc/meminfoの詳細フィールドで精密診断する
1. MemAvailableとMemFreeの違い
/proc/meminfo はカーネルが持つメモリの詳細な統計情報を提供します。free コマンドの表示もここから値を引いています。
[web01]$ cat /proc/meminfo MemTotal: 8058880 kB # 物理メモリ合計 MemFree: 524288 kB # 未使用の物理メモリ(小さくても問題ない) MemAvailable: 3014656 kB # 実際に利用可能な推計値(要注目) Buffers: 188416 kB # ブロックデバイスのバッファ Cached: 2777984 kB # ページキャッシュ SwapCached: 28672 kB # スワップキャッシュ(メモリに戻したがページは残留) SwapTotal: 2097152 kB # スワップ合計 SwapFree: 1835008 kB # 未使用のスワップ Slab: 229376 kB # カーネルのSlabアロケータ使用量(長期増加に注意)
シェルスクリプトから MemAvailable を数値として取得するには次のコマンドを使います。
# MemAvailable の値(kB)を取得 $ grep '^MemAvailable:' /proc/meminfo | awk '{print $2}' 3014656
2. 監視に使うべき主要フィールド
シェルスクリプトによる自動監視に使うフィールドを整理します。
・MemTotal:全体の分母。使用率計算のベースに使う
・MemAvailable:実際に使える空き容量の推計値。監視の主指標
・SwapFree / SwapTotal:スワップの逼迫度を監視
・Slab:カーネルのSlabが長期増加する場合はメモリリークの疑い
3つのコマンドを組み合わせた実践的な監視設計
3つのコマンドはそれぞれ役割が異なります。これをうまく組み合わせることで、点ではなく面でメモリ状態を把握できます。
| コマンド | 役割 | 主な監視指標 |
|---|---|---|
| free -h | 現時点のスナップショット確認 | available / swap used |
| vmstat N M | 時系列のトレンド把握 | si / so(スワップ方向)、b(I/O待ちプロセス数) |
| cat /proc/meminfo | スクリプト連携・精密診断 | MemAvailable / Slab / SwapFree |
監視フローとしては、まず cron で /proc/meminfo の MemAvailable を定期チェックし、閾値を超えたときに詳細情報(vmstat / free の出力)をメールや Slack へ通知するパターンが実用的です。
閾値アラートのシェルスクリプト実装例
以下は MemAvailable の使用率が閾値を超えた場合にアラートを送信するスクリプトです。cron に登録して5分おきに実行するのが基本設計です。
#!/bin/bash # memory-alert.sh — メモリ使用率監視スクリプト # cron 設定例: */5 * * * * /usr/local/bin/memory-alert.sh THRESHOLD_PERCENT=80 # 使用率の警告閾値(%) SWAP_THRESHOLD_PERCENT=50 # スワップ警告閾値(%) ALERT_MAIL="admin@example.com" HOSTNAME_VAL=$(hostname) # /proc/meminfo から各値を取得(kB単位) MEM_TOTAL=$(grep '^MemTotal:' /proc/meminfo | awk '{print $2}') MEM_AVAIL=$(grep '^MemAvailable:' /proc/meminfo | awk '{print $2}') SWAP_TOTAL=$(grep '^SwapTotal:' /proc/meminfo | awk '{print $2}') SWAP_FREE=$(grep '^SwapFree:' /proc/meminfo | awk '{print $2}') # メモリ使用率を計算(整数演算) MEM_USED=$((MEM_TOTAL - MEM_AVAIL)) MEM_PERCENT=$((MEM_USED * 100 / MEM_TOTAL)) # スワップ使用率を計算(スワップなしの場合は0) if [ "$SWAP_TOTAL" -gt 0 ]; then SWAP_USED=$((SWAP_TOTAL - SWAP_FREE)) SWAP_PERCENT=$((SWAP_USED * 100 / SWAP_TOTAL)) else SWAP_PERCENT=0 fi ALERT_MSG="" if [ "$MEM_PERCENT" -ge "$THRESHOLD_PERCENT" ]; then ALERT_MSG="${ALERT_MSG}[ALERT] ${HOSTNAME_VAL}: メモリ使用率 ${MEM_PERCENT}%\n" fi if [ "$SWAP_PERCENT" -ge "$SWAP_THRESHOLD_PERCENT" ]; then ALERT_MSG="${ALERT_MSG}[WARN] ${HOSTNAME_VAL}: スワップ使用率 ${SWAP_PERCENT}%\n" fi if [ -n "$ALERT_MSG" ]; then DETAIL="$(free -h)\n$(vmstat 1 3)" printf "%s\n\n詳細:\n%s\n" "$ALERT_MSG" "$DETAIL" \ | mail -s "[MEMORY ALERT] ${HOSTNAME_VAL}" "$ALERT_MAIL" fi
スクリプトを /usr/local/bin/memory-alert.sh に配置し、実行権限を付与した後、crontab に登録します。
# 実行権限を付与 $ chmod 700 /usr/local/bin/memory-alert.sh # crontab に登録(5分おき) $ crontab -e */5 * * * * /usr/local/bin/memory-alert.sh
メモリ監視で見落としがちな落とし穴と対処法
落とし穴1:free の値だけを見てしまう
前述のとおり、Linuxはキャッシュに空きメモリを積極的に使います。free が数十MBしかなくても available が十分あれば問題ありません。MemFree ではなく MemAvailable を必ず監視の主指標にしてください。
落とし穴2:Slabメモリのリークを見逃す
/proc/meminfo の Slab フィールドが長期にわたって増加し続ける場合、カーネルモジュールやドライバのメモリリークが疑われます。Slabは通常のメモリとは別の管理領域のため、free や top だけでは気づけません。slabtop コマンドや /proc/slabinfo で詳細を確認しましょう。
落とし穴3:OOM Killerのスコアを把握していない
OOM Killer は /proc/PID/oom_score が最も高いプロセスを優先して終了します。重要なプロセス(例:データベース)が不当にKillされるのを防ぐには、oom_score_adj で調整します。
# mysqld プロセスの OOM スコアを確認 $ cat /proc/$(pgrep mysqld)/oom_score 245 # OOM Killer の対象優先度を下げる(-1000 で対象外) $ echo -1000 > /proc/$(pgrep mysqld)/oom_score_adj
本記事のまとめ
Linuxサーバーのメモリ監視は、単一コマンドではなく複数のコマンドを組み合わせた「監視設計」として考えることが重要です。
| やりたいこと | コマンド |
|---|---|
| 現状の空きメモリを素早く確認する | free -h |
| スワップの発生を時系列で確認する | vmstat 5 10 |
| MemAvailable を数値で取得する | grep '^MemAvailable:' /proc/meminfo | awk '{print $2}' |
| メモリ使用率を自動監視・アラートする | memory-alert.sh(cron 登録) |
| Slabメモリのリークを確認する | slabtop |
| プロセスの OOM スコアを確認する | cat /proc/PID/oom_score |
メモリ監視の次は、本番で通用するLinuxサーバー管理を体系的に学びませんか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。メモリ監視設計・スワップ管理・OOM Killer対策まで、実務で即使える知識を体系的に習得できます。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【Linuxハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:WireGuardをLinuxに設定する方法|鍵ペア生成からwg-quickで接続するまでの実践手順
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます