swap の役割と運用 - メモリ不足を回避する
swap とは何か?
swap は物理 RAM が不足したときにディスクをメモリの代替として使う仮想メモリ領域。RAM が枯渇してもすぐにプロセスが強制終了されず、処理を継続できる保険機能として働く。
swap 領域の形式は 2 種類ある。
| 形式 | 説明 |
|---|---|
| スワップパーティション | ディスクの専用パーティション。高速だが変更が難しい |
| スワップファイル | 通常ファイルとして作成。容量変更が容易で現在主流 |
swap はディスク I/O を伴うため RAM より数十倍遅い。恒常的にスワップが発生している状態(スラッシング)は障害の前兆。根本原因はメモリ不足であり、swap を増やしても解決はできない。
swap の状態を確認するには?
free -h が最も手軽な確認手段。Swap: 行の used 列が増加していればスワッピングが発生している。
free -h
total used free shared buff/cache available Mem: 3.8Gi 2.1Gi 408Mi 45Mi 1.3Gi 1.4Gi Swap: 2.0Gi 512Mi 1.5Gi
swap の詳細(ファイル・パーティション別)を確認するには swapon --show。
swapon --show
NAME TYPE SIZE USED PRIO /swapfile file 2G 512M -2
スワッピングの発生頻度(ページイン・ページアウト)を確認するには vmstat。
vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 524288 418032 98304 1350656 0 0 2 5 45 80 2 1 97 0 0 0 1 524288 200000 98304 1350672 8 12 0 20 65 120 2 1 90 7 0
si(swap in)と so(swap out)が継続的に非ゼロの場合、スラッシングが疑われる。
スワップファイルを作成するには?
RAM が不足している環境でスワップファイルを追加する手順。Ubuntu / Debian 系の標準的な方法。
sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile
fallocate が使えない環境(NFS や一部のファイルシステム)では dd if=/dev/zero of=/swapfile bs=1M count=2048 で代替できる。
有効化後、swapon --show で確認。
swapon --show
NAME TYPE SIZE USED PRIO /swapfile file 2G 0B -2
再起動後も自動で有効にする
/etc/fstab に追記して永続化する。
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
/etc/fstab 編集後は sudo swapon -a で構文エラーがないか確認すること。エラーがあると起動に失敗する。
スワップファイルを削除する場合
sudo swapoff /swapfile sudo rm /swapfile
/etc/fstab からも該当行を削除すること。
swappiness を調整するには?
swappiness はカーネルが swap をどの程度積極的に使うかを制御するパラメータ(0〜100)。デフォルト値は 60。
| 値 | 動作 |
|---|---|
| 0 | 枯渇時のみ swap を使用(完全に無効にはならない) |
| 10〜30 | デスクトップ環境向け(RAM 優先) |
| 60 | デフォルト |
| 100 | 積極的に swap を使用 |
現在値の確認。
cat /proc/sys/vm/swappiness
一時的に変更(再起動で元に戻る)。
sudo sysctl vm.swappiness=10
永続化する場合は /etc/sysctl.d/ 配下に追記。
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
データベースサーバー(MySQL / PostgreSQL など)では swappiness を 1〜10 に下げる設定が一般的。スワッピングによるクエリレイテンシのスパイクを回避できる。
OOM killer が発生したら?
RAM と swap の両方が枯渇すると、カーネルの OOM killer(Out-Of-Memory killer)が動作してプロセスを強制終了する。突然プロセスが消える・システムが不安定になった場合は OOM kill の痕跡を確認する。
dmesg | grep -i 'oom\|killed process\|out of memory'
[123456.789] Out of memory: Killed process 1234 (mysqld) total-vm:2097152kB, anon-rss:1048576kB, file-rss:0kB
systemd ジャーナルからも確認できる。
journalctl -k | grep -i 'oom\|killed'
OOM kill は swap を増やしても根本解決にはならない。メモリリークや設定ミスが原因であることが多い。再発する場合は top / htop でプロセスのメモリ使用量を継続監視し、原因プロセスを特定すること。
特定プロセスを OOM kill から保護する(暫定措置)
OOM killer のスコアリングを調整し、重要プロセスを保護する。値は -1000(kill されない)〜 1000(最優先で kill)の範囲。
echo -1000 | sudo tee /proc/$(pgrep mysqld)/oom_score_adj
再起動すると設定は失われる。本番環境での適用はリスクを理解した上で行うこと。