スワップ
ディスクを使ったメモリ拡張
スワップとは
スワップは、物理メモリが不足した際にディスクをメモリの代わりに使用する仕組みです。 使用頻度の低いページをディスクに退避し、必要な時に読み戻します。 ディスクはメモリより遥かに遅いため、過度なスワップはパフォーマンス低下を招きます。
スワップの動作
Swap Out
- • メモリ不足時に発生
- • 使用頻度の低いページを選択
- • ディスクに書き出し
- • 物理メモリを解放
Swap In
- • スワップアウトされたページへアクセス
- • Major Page Faultが発生
- • ディスクから読み込み
- • 物理メモリに配置
スワップの管理
1 # スワップ状況確認 2 swapon --show 3 free -h 4 cat /proc/swaps 5 6 # スワップ使用プロセス確認 7 for file in /proc/*/status; do 8 awk '/VmSwap|Name/{printf "%s ", $2}' $file 2>/dev/null 9 echo 10 done | sort -k 2 -nr | head 11 12 # スワップファイル作成 13 sudo fallocate -l 2G /swapfile 14 sudo chmod 600 /swapfile 15 sudo mkswap /swapfile 16 sudo swapon /swapfile 17 18 # /etc/fstab に永続化 19 # /swapfile none swap sw 0 0 20 21 # スワップ無効化 22 sudo swapoff /swapfile 23 24 # スワップパーティション作成 25 sudo mkswap /dev/sda2 26 sudo swapon /dev/sda2
vm.swappiness
カーネルがどの程度積極的にスワップを使用するかを制御するパラメータ。 0〜100の値で、低いほどスワップを避ける傾向。
swappiness = 0
OOM直前までスワップを使用しない(完全に0ではない)
swappiness = 10
DBサーバーなど、メモリ重視のワークロードに推奨
swappiness = 60
デフォルト値。一般的なワークロード向け
1 # 現在値確認 2 cat /proc/sys/vm/swappiness 3 4 # 一時的に変更 5 sudo sysctl vm.swappiness=10 6 7 # 永続化(/etc/sysctl.conf) 8 echo "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スコア確認 2 cat /proc/PID/oom_score 3 4 # OOMスコア調整(-1000: 対象外, 1000: 最優先で終了) 5 echo -500 > /proc/PID/oom_score_adj 6 7 # systemdサービスで設定 8 # [Service] 9 # OOMScoreAdjust=-500 10 11 # OOM発生確認 12 dmesg | grep -i "out of memory" 13 journalctl | grep -i oom 14 15 # メモリオーバーコミット設定 16 cat /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 で設定