LinuxのSwapを正しく理解する
Linux 101
2026年02月19日
Key Takeaways
メモリ圧がかかった → reclaim発動 → coldなanonymousページをswapへ
メモリ階層の基礎: なぜswapが必要になるか
L1/L2/L3 ← 物理メモリ ← Swap(ディスク)の5段階キャッシュ構造
- CPUが扱えるのはCPU内蔵メモリのみ.物理メモリ(DRAM)ですらCPUから見れば外部
- 各段は速度を犠牲に容量を稼ぐ構造.上位段では載らないものを下位段に置く
- swap は5段目に位置する.貴重な物理メモリを有効活用するためのバッファ
- CPUキャッシュ = 取皿,物理メモリ = 大皿と考えると理解しやすい
- 取皿に載り切らないものは大皿から取ってきては捨てる.だから大皿(メモリ)は速度が重要
- swap は大皿に置ききれないものを冷蔵庫に入れておくようなもの.取り出しは遅いが無駄を減らせる
Swap の正体: Anonymous ページの退避先
「メモリ不足の増設」ではなく「メモリから捨てられない不活発なデータの置き場」
- Linuxのメモリページは大きくFile-backed(ファイル起源) と Anonymous(プロセスが確保)の2種
- メモリ回収時,Fileページは捨てるだけで済む(ディスクに実体があるため再読込可能)
- Anonページは実体がないので捨てると失われる → だから swap に退避する必要がある
- swapがなければ Anonページは退避できず,メモリ解放の手段が File ページ破棄のみに限定される
File-backed ページ
- 実行ファイル・ライブラリ・ページキャッシュなど,ディスク上にマスターが存在
- メモリ回収時はただ破棄するだけで良い(再読込可)
- 例:
/usr/bin/ のバイナリ,読み込み中のファイル
Anonymous ページ
- プロセスが
malloc 等で確保したディスクに実体がないメモリ
- 捨てるとプロセスが壊れる.だからswapに退避するしかない
- swapがなければメモリ上に居座り続ける
- 例: プロセスのヒープ,スタック
- メモリが逼迫した時,swap あり なら「使われていないAnonページ」を退避して,よく使うFileページをメモリに残せる
- swap なし だと,メモリを空けるには「Fileページ破棄」しか選択肢がない ⇒ ページキャッシュ消失で I/O 激増
- wap は「メモリの増量」ではなくホット/コールドの優先度調整の道具
Swap は必要か?
「必要不可欠」ではないが「あって困ることは稀」
- swap があって悪いことはないが, 暗号化環境のみ注意
- 現代のデスクトップ用途(16GB以上)ではswapが実際に使われる場面は少ない
- ハイバネーション(休止状態)を使うならメモリ以上のswapサイズが必須
- メモリ圧時にFileページよりAnonページを退避できる選択肢が増える
- swap がないとメモリ圧時にシステムが死ぬ可能性が高まる
- ハイバネーションの退避領域として必要
- Linux 4.0 以降は大きめ swap でも実害なし
暗号化環境
- swap も暗号化対象にしなければならない
- 暗号化コストが高く,swap 出入りで計算リソースを消費
- 場合によっては swap を切った方が速い
ストレージ容量が厳しい場合
- 256GB SSD に 128GB swap は現実的でない
- 高速SSDの容量増加がRAMに追いついていない
Swappiness の正しい理解
「swapしやすさ」ではなく「fileページの代わりにanonを解放する度合い」
- メモリ回収が必要になった時,カーネルは2択を迫られる
- Fileページを捨てる(= page cache を減らす)
- Anonページを swap に退避する(= swap を使う)
- swappiness は(B)を優先する割合.200 スケールの重み付けと理解する1
vm.swappiness = 0 は特別扱いで,anonページのスキャン自体を避ける
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