LinuxのSwapを正しく理解する

Linux 101

Ryo Nakagami

2026年02月19日

Key Takeaways

メモリ圧がかかった → reclaim発動 → coldなanonymousページをswapへ

メモリ階層の基礎: なぜswapが必要になるか

L1/L2/L3 ← 物理メモリ ← Swap(ディスク)の5段階キャッシュ構造

  • CPUが扱えるのはCPU内蔵メモリのみ.物理メモリ(DRAM)ですらCPUから見れば外部
  • 各段は速度を犠牲に容量を稼ぐ構造.上位段では載らないものを下位段に置く
  • swap は5段目に位置する.貴重な物理メモリを有効活用するためのバッファ

L1/L2 Cache

  • 数KB〜数MB
  • 〜1ns

L3 Cache

  • 数MB〜数十MB
  • 〜10ns

物理メモリ (DRAM)

  • 数GB〜数百GB
  • 〜100ns

Swap (SSD/HDD)

  • 数GB〜数百GB
  • μs〜ms
上位ほど高速・小容量 / 下位ほど低速・大容量

REMARKS: 大皿と取皿と冷蔵庫

  • CPUキャッシュ = 取皿,物理メモリ = 大皿と考えると理解しやすい
  • 取皿に載り切らないものは大皿から取ってきては捨てる.だから大皿(メモリ)は速度が重要
  • swap は大皿に置ききれないものを冷蔵庫に入れておくようなもの.取り出しは遅いが無駄を減らせる

Swap の正体: Anonymous ページの退避先

「メモリ不足の増設」ではなく「メモリから捨てられない不活発なデータの置き場」

  • Linuxのメモリページは大きくFile-backed(ファイル起源) と Anonymous(プロセスが確保)の2種
  • メモリ回収時,Fileページは捨てるだけで済む(ディスクに実体があるため再読込可能)
  • Anonページは実体がないので捨てると失われる → だから swap に退避する必要がある
  • swapがなければ Anonページは退避できず,メモリ解放の手段が File ページ破棄のみに限定される

File-backed ページ

  • 実行ファイル・ライブラリ・ページキャッシュなど,ディスク上にマスターが存在
  • メモリ回収時はただ破棄するだけで良い(再読込可)
  • 例: /usr/bin/ のバイナリ,読み込み中のファイル

Anonymous ページ

  • プロセスが malloc 等で確保したディスクに実体がないメモリ
  • 捨てるとプロセスが壊れる.だからswapに退避するしかない
  • swapがなければメモリ上に居座り続ける
  • 例: プロセスのヒープ,スタック

REMARKS: swapがないと何が困るか

  • メモリが逼迫した時,swap あり なら「使われていないAnonページ」を退避して,よく使うFileページをメモリに残せる
  • swap なし だと,メモリを空けるには「Fileページ破棄」しか選択肢がない ⇒ ページキャッシュ消失で I/O 激増
  • wap は「メモリの増量」ではなくホット/コールドの優先度調整の道具

Swap は必要か?

「必要不可欠」ではないが「あって困ることは稀」

  • swap があって悪いことはないが, 暗号化環境のみ注意
  • 現代のデスクトップ用途(16GB以上)ではswapが実際に使われる場面は少ない
  • ハイバネーション(休止状態)を使うならメモリ以上のswapサイズが必須

Pros — swap を有効にしておく理由

  1. メモリ圧時にFileページよりAnonページを退避できる選択肢が増える
  2. swap がないとメモリ圧時にシステムが死ぬ可能性が高まる
  3. ハイバネーションの退避領域として必要
  4. Linux 4.0 以降は大きめ swap でも実害なし

Cons — swap が問題になるケース

暗号化環境

  • swap も暗号化対象にしなければならない
  • 暗号化コストが高く,swap 出入りで計算リソースを消費
  • 場合によっては swap を切った方が速い

ストレージ容量が厳しい場合

  • 256GB SSD に 128GB swap は現実的でない
  • 高速SSDの容量増加がRAMに追いついていない

Swappiness の正しい理解

「swapしやすさ」ではなく「fileページの代わりにanonを解放する度合い」

  • メモリ回収が必要になった時,カーネルは2択を迫られる
      1. Fileページを捨てる(= page cache を減らす)
      1. Anonページを swap に退避する(= swap を使う)
  • swappiness は(B)を優先する割合.200 スケールの重み付けと理解する1
  • vm.swappiness = 0 は特別扱いで,anonページのスキャン自体を避ける
    • 0 に設定しても OOM 寸前には使われる

swappiness の挙動

挙動 向いている用途
0 anonスキャン自体を避ける 絶対に swap させたくない DB サーバ等
1-60 Fileページ破棄を優先 デスクトップ(defaultはだいだい60)
100 File/Anon を同程度にスキャン バランス型
200 anon 退避を強く優先 page cache を最大化したいワークロード

確認・変更方法

現在値の確認

$ cat /proc/sys/vm/swappiness
60

恒久変更(/etc/sysctl.d/ 配下)

# /etc/sysctl.d/99-swappiness.conf
vm.swappiness = 10

反映は sudo sysctl --system