スワップ

ディスクを使ったメモリ拡張

スワップとは

スワップは、物理メモリが不足した際にディスクをメモリの代わりに使用する仕組みです。 使用頻度の低いページをディスクに退避し、必要な時に読み戻します。 ディスクはメモリより遥かに遅いため、過度なスワップはパフォーマンス低下を招きます。

スワップの動作

Swap Out

  • • メモリ不足時に発生
  • • 使用頻度の低いページを選択
  • • ディスクに書き出し
  • • 物理メモリを解放

Swap In

  • • スワップアウトされたページへアクセス
  • • Major Page Faultが発生
  • • ディスクから読み込み
  • • 物理メモリに配置

スワップの管理

1# スワップ状況確認
2swapon --show
3free -h
4cat /proc/swaps
5
6# スワップ使用プロセス確認
7for file in /proc/*/status; do
8 awk '/VmSwap|Name/{printf "%s ", $2}' $file 2>/dev/null
9 echo
10done | sort -k 2 -nr | head
11
12# スワップファイル作成
13sudo fallocate -l 2G /swapfile
14sudo chmod 600 /swapfile
15sudo mkswap /swapfile
16sudo swapon /swapfile
17
18# /etc/fstab に永続化
19# /swapfile none swap sw 0 0
20
21# スワップ無効化
22sudo swapoff /swapfile
23
24# スワップパーティション作成
25sudo mkswap /dev/sda2
26sudo swapon /dev/sda2

vm.swappiness

カーネルがどの程度積極的にスワップを使用するかを制御するパラメータ。 0〜100の値で、低いほどスワップを避ける傾向。

swappiness = 0

OOM直前までスワップを使用しない(完全に0ではない)

swappiness = 10

DBサーバーなど、メモリ重視のワークロードに推奨

swappiness = 60

デフォルト値。一般的なワークロード向け

1# 現在値確認
2cat /proc/sys/vm/swappiness
3
4# 一時的に変更
5sudo sysctl vm.swappiness=10
6
7# 永続化(/etc/sysctl.conf)
8echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf

OOM Killer

Out of Memory Killerは、メモリ完全枯渇時にプロセスを強制終了する カーネル機能です。スワップも使い果たした最終手段として発動します。

OOMスコア

各プロセスにスコアが付与され、高いプロセスが優先的に終了される。 メモリ使用量、実行時間、優先度などを考慮。

OOM調整

oom_score_adj で-1000〜1000の調整が可能。-1000でOOM対象外。

1# OOMスコア確認
2cat /proc/PID/oom_score
3
4# OOMスコア調整(-1000: 対象外, 1000: 最優先で終了)
5echo -500 > /proc/PID/oom_score_adj
6
7# systemdサービスで設定
8# [Service]
9# OOMScoreAdjust=-500
10
11# OOM発生確認
12dmesg | grep -i "out of memory"
13journalctl | grep -i oom
14
15# メモリオーバーコミット設定
16cat /proc/sys/vm/overcommit_memory
17# 0: ヒューリスティック(デフォルト)
18# 1: 常に許可
19# 2: 制限(物理メモリ+スワップの一定割合まで)

SRE/インフラ観点

本番環境でのスワップ

  • Kubernetes: ノードでスワップ無効化が推奨(1.22以降は条件付きで許可)
  • DB: swappiness=1〜10、または無効化
  • 一般サーバー: 物理メモリの0.5〜1倍程度

監視とアラート

  • • スワップ使用率が継続的に高い → メモリ増設検討
  • • vmstatのsi/soが頻繁 → パフォーマンス問題
  • • OOM Killer発動 → 根本原因の調査が必要

コンテナ環境

  • • cgroups memory limitでコンテナごとのメモリ制限
  • • コンテナ内OOMはホストのOOM Killerとは別に発生
  • • Kubernetes: resources.limits.memory で設定