
「サーバー、なんか重いんですけど」と言われて見に行く。でも top を叩いても、CPU使用率はそこまで高くない。ディスクも空いている。エラーログも静か。なのに、ls を打つだけでワンテンポ遅れる。管理画面を開くと、いつもなら一瞬なのに数秒待たされる——。「原因が見当たらないのに、確かに遅い」。この気持ち悪さ、けっこう消耗しますよね。
そんなとき、静かに足を引っ張っていることがあるのがスワップです。しかもスワップは、「使われているかどうか」だけを見ても判断を誤りやすい、ちょっとクセのある指標です。この記事では、その見分け方を一緒に順番に整理していきます。
結論:見るのは「swapの残量」ではなく「いま出し入れしているか」
先にお伝えします。スワップを疑うときに見るのは、次の3つです。
free -hの Swap used:どれくらいスワップに退避されているか(=過去の痕跡)。vmstat 1のsi/so:いま毎秒どれだけ出し入れしているか(=現在進行形の負荷)。これがいちばん大事です。- メモリの余裕(
free -hの available):そもそも空きが枯れているのか。
ポイントはひとつだけ覚えてください。「swap が使われている」ことと「swap が原因で遅い」ことは、別の話です。
Swap used が数百MBあっても、si/so がずっと 0 なら、それは「昔ヒマなときに、使われていないデータを倉庫に片づけた」だけ。悪さはしていません。逆に、Swap used がそれほど大きくなくても、si/so が毎秒動き続けているなら、メモリとディスクの間で荷物を往復させ続けている状態で、サーバー全体が遅くなります。
そもそもスワップって何をしているの?
スワップ(swap)は、メモリが足りなくなったときに、当面使わないデータをディスクへ一時的に退避させる仕組みです。ディスク上のスワップ領域(パーティションやファイル)が、メモリの「臨時の物置」として使われます。
ここで大事なのが速度差です。メモリとディスクでは、読み書きの速さが桁違いに違います。SSDでもメモリよりずっと遅く、HDDならさらに差が開きます。つまり、
- 物置に片づけるだけ(たまに
soが動く)= メモリを有効活用しているだけ。むしろ健全。 - 物置から出しては戻し、を繰り返す(
siとsoが両方ずっと動く)= 遅いディスクを何度も往復するので、体感がガクッと落ちる。
この「往復し続けている」状態を、俗にスラッシングと呼びます。CPU使用率としては wa(I/O待ち)に出たり、そもそも数字に出にくかったりするので、「CPUは高くないのに全部遅い」という、あの気持ち悪い症状になるわけです。

手順1:free -h で全体像をつかむ
まずは今の状態を見ます。
free -h
見るのは2か所です。
- Swap 行の used:どれだけ退避されているか。
- Mem 行の available:これから使える実質的な空き。
freeの数字のうち、いちばん実態に近いのがこれです。
available が全体に対してごくわずかしか残っていないなら、メモリが逼迫しています。逆に available に十分な余裕があるのに Swap used だけそこそこある場合は、前に混んだ時間帯があって、その名残が残っているだけというケースがよくあります。スワップは、戻す必要が出るまで自動では戻ってこないためです。
なお、スワップ領域そのものがあるか・どこかは次で確認できます。
swapon --show
何も表示されなければ、そのサーバーにはスワップがありません(その場合、メモリ不足はスワップではなく OOM として現れます)。
手順2:vmstat 1 で「いま動いているか」を確かめる
ここが本命です。
vmstat 1 10
1秒ごとに10回、状況を出してくれます。注目するのは swap 欄の2つです。
si(swap in):ディスクのスワップ領域から、メモリへ戻している量so(swap out):メモリから、スワップ領域へ退避している量
判断はシンプルです。
siもsoもずっと 0 → いま現在、スワップは悪さをしていません。遅さの原因は別のところにあります。soがときどき出るだけ → 片づけている程度。ふつうは問題になりません。siとsoが両方、毎秒のように出続けている → これが「スワップで遅い」状態です。ここが犯人と考えてよい状況です。
同じ画面の wa(CPUのI/O待ち)も一緒に上がっていれば、「みんなディスクの応答を待って行列している」という裏づけになります。ロードアベレージだけ高くて CPU使用率が低いときの正体も、しばしばこれです。
補足:vmstat は1行目が「起動してからの平均」なので、2行目以降を見てください。1行目だけを見て判断すると、過去の平均に引っぱられます。
手順3:どのプロセスがスワップを使っているか探す
スワップが動いていると分かったら、次は「誰が食っているか」です。各プロセスのスワップ使用量は /proc/<PID>/status の VmSwap に出ています。まとめて見るなら、たとえばこうです。
for p in /proc/[0-9]*; do
s=$(awk '/^VmSwap/{print $2}' $p/status 2>/dev/null)
n=$(awk '/^Name/{print $2}' $p/status 2>/dev/null)
[ -n "$s" ] && [ "$s" -gt 0 ] && echo "$s KB $n $p"
done | sort -rn | head -20
上位に出てきたものが、スワップに退避されている量の多いプロセスです。よく顔を出すのは、
- DB(MySQL/PostgreSQL など):バッファの設定がメモリ量に対して大きすぎる
- アプリのワーカー(php-fpm、Puma、Gunicorn、Java など):同時プロセス数・スレッド数の設定が多すぎる
- バッチ処理:一時的に大量のデータをメモリに載せている
- 監視・バックアップのエージェント:夜間だけ膨らむ
あたりです。top を開いて Shift + M(メモリ順ソート)で RES の大きい順に見るのも、合わせ技として有効です。
ここで一緒に確認したいのが、時間帯との対応です。「毎晩2時ごろだけ重い」なら、その時間に走っているバッチやバックアップと重なっていないか。cron の一覧と見比べるだけで、原因が一気に絞れることがあります。
手順4:一次対処は「減らす」から。焦って swapoff しない
原因の見当がついたら、対処です。安全な順に並べます。
1. 一時的な負荷なら、まず収まるのを確認する バッチや一時的なアクセス集中が原因で、すでに si/so が落ち着いてきているなら、あわてて何かする必要はありません。Swap used の数字が残っていても、それ自体は害ではありません。
2. メモリを多く使っている設定を見直す 再発しているなら、ここが本丸です。よくある効きどころは、
- php-fpm の
pm.max_children、Puma/Gunicorn のワーカー数など、同時に立ち上がるプロセス数 - MySQL の
innodb_buffer_pool_sizeなど、DBが確保するメモリ量 - 不要な常駐サービス(使っていないのに動いているもの)
「同時に走る数 × 1プロセスあたりの使用量」が、実メモリに収まっているか。この掛け算がメモリ設計のいちばん基本です。設定を変えるときは、必ず変更前の値をメモして、少しずつ動かしてください。
3. 該当プロセスを再起動して様子を見る(暫定) メモリの使用量がじわじわ増えていくタイプ(リーク)なら、対象サービスの再起動でいったん戻ります。ただしこれは暫定対応です。再発の間隔を記録しておくと、恒久対応の材料になります。
4. swapoff は慎重に 「スワップを切れば速くなるのでは」と思いたくなりますが、swapoff はスワップ上のデータを全部メモリへ戻す動作です。メモリに余裕がない状態でやると、その瞬間に OOM でプロセスが落ちる可能性があります。実行するなら、free -h の available が Swap used を十分上回っていることを確認してからにしてください。急いでいるときほど、ここは踏みとどまる場面です。
5. vm.swappiness の調整は「効くこともある」程度に vm.swappiness は、カーネルがどれくらい積極的にスワップを使うかの傾向値です(多くのディストリビューションで既定は 60)。値を下げるとスワップに出しにくくはなりますが、メモリが足りないという事実そのものは変わりません。順番としては、まず使用量を減らす(手順2)。swappiness はそのあとの微調整、と考えておくと安全です。設定を変える場合も、いきなり恒久化せず、検証環境と一時反映で挙動を確かめてからにしてください。
明日やること:平常時の si / so を1行メモしておく
スワップがいちばん役に立つのは、実は障害のときより「ふだんの状態を知っているとき」です。
明日、気になっているサーバーで一度だけ、次を確認してみてください。
free -h
vmstat 1 5
そして、「平常時は Swap used がこれくらいで、si/so はほぼ 0」という1行を運用メモに残しておく。これだけで、次に「なんか重い」と言われたとき、vmstat を1回叩けば「いつもと違うかどうか」が即答できるようになります。監視を入れているなら、swap使用量そのものより、swap in/out のレートをグラフに出しておくと、より早く気づけます。
チェックリスト:サーバーが重くてスワップを疑うとき
free -hで Swap used と Mem available を確認したかswapon --showで、そもそもスワップ領域があるか確認したかvmstat 1の 2行目以降でsi/soを見たか(1行目は起動後の平均)siとsoが両方とも継続して出ているか(=現在進行形かどうか)を見分けたかwa(I/O待ち)やロードアベレージの動きとつじつまが合っているか確かめたか/proc/<PID>/statusの VmSwap やtopの RES で、犯人プロセスを特定したか- 重くなる時間帯と、cron・バッチ・バックアップが重なっていないか照らしたか
- 対処は「メモリ使用量を減らす」から入ったか(設定値は変更前をメモしたか)
swapoffを実行する前に、available が Swap used を上回っていることを確認したか- 平常時の Swap used と si/so を、運用メモに1行残したか
よければ、こちらも
スワップは、「メモリが足りなくなってきた」という静かなサインでもあります。同じ“重い・遅い”をたどる手順や、その先の OOM の見方も合わせて型にしておくと、落ち着いて対処できます。
- メモリ不足でプロセスが落ちる|OOMの兆候の見つけ方と一次対処
- ロードアベレージの正しい読み方|数字が高い=危険とは限らない
- CPU使用率が高いときの原因プロセス特定手順|top・psの見方
- 「サイトが重い」の切り分け手順|どこが遅いかを順番に絞る

「原因が見当たらないのに遅い」は、調べている側がいちばん消耗する状況です。でも、free と vmstat を1回ずつ叩いて si/so を見る——この一手を持っておくだけで、その正体不明の重さが「メモリが足りていない」という具体的な話に変わります。
今日はまず、気になっているサーバーで vmstat 1 5 を一度だけ叩いて、平常値を1行メモするところから始めれば十分です。ふだんを知っている人が、いちばん早く異常に気づけます。原因が名前のあるものに変わった時点で、もう対応は前に進んでいます。
ほかの実務ヒントは記事一覧からどうぞ。保守運用の小さな備えを、メールでも少しずつお届けしています。