Linux Swap とは?Debian/Ubuntu で Swap を追加する方法|swapfile fstab swappiness
Swap とは
Swap は、Linux カーネルが物理 RAM の不足時に使うディスク上の領域です。長く使われていないメモリページをディスクに退避させ、アクティブな処理のために RAM を空けます。Swap の置き場所は、専用ディスク、起動ディスク内の専用パーティション、あるいは既存パーティション内の通常ファイルのいずれでも構いません。
Ubuntu や CentOS などのインストーラに自動パーティショニングを任せると、通常は RAM とほぼ同じサイズの Swap パーティションが切られます。一方、Azure や Google Cloud Platform (GCP) の VM イメージは、デフォルトでは Swap が設定されていないことが多いです。後から手動で追加できるので、本記事の後半ではその手順を紹介します。
Swap のメリット
OS の主な役割はハードウェアリソースの管理です。CPU 時間をプロセスに割り当て、メモリをアプリケーションに割り当てます。アプリが要求するメモリが利用可能な量を超えそうになると、カーネルはまずキャッシュやバッファなどの重要度の低いページを解放して空きを作ります。それでも足りなければ OOM killer が動き、システム全体を守るためにプロセスを強制終了します。
Swap があれば、強制終了の前にもう一つ選択肢が増えます。冷えたデータをディスクにページアウトすることで余裕を作り、ハードクラッシュの可能性を減らせます。
Swap のデメリット
Swap はディスク上にあるため、レイテンシもスループットも RAM とは比べものになりません。高速な NVMe SSD でも 5 GB/s 程度であり、DDR4-3200 のメモリ帯域幅およそ 25.6 GB/s には遠く及びません。さらにレイテンシの差は桁違いです。
ごく一部の冷えたページが Swap に追い出されるだけなら気付きませんが、Swap を激しく使い始めるとシステムは一気に重くなります。いわゆる「スワップスラッシング」と呼ばれる状態です。
このため、本番サーバーでは Swap を使わない運用がよく見られます。利用者に重いサービスを返すくらいなら、いっそクラッシュさせて systemd やプロセススーパーバイザーで自動再起動した方がよい、という判断です。再起動でメモリ状態がリセットされ、ログにエラーが残るので、運用担当者は RAM 増設の必要性を早期に判断できます。
個人利用であれば Swap は依然として有効です。アプリが編集中にクラッシュすればデータを失いますが、システムが遅くなるだけなら少なくとも保存する時間は稼げます。ただし RAM が十分大きいなら、そもそも Swap は不要です。
Debian/Ubuntu での Swap 追加手順
Swap の状態を確認
sudo swapon --show
Swap が未設定なら何も出力されません。free コマンドでも確認でき、未設定なら Swap 行はすべて 0 です。
Swap ファイルを作成
# 1 GB のファイルを確保
sudo fallocate -l 1G /swapfile
# root のみ読み書きできるように権限を制限
sudo chmod 600 /swapfile
# Swap 領域としてフォーマット
sudo mkswap /swapfile
# Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
# no label, UUID=b3b91233-6a5b-44d3-9d13-d7c66285a166
fallocate はディスク領域を一括で確保するコマンドです。サンプルの 1G は必要に応じて変更してください。実行後に df で確認すると、空き容量が 1 GB 減っているのがわかります。mkswap は UUID を出力しますが、値は環境ごとに異なります。
Swap を有効化
sudo swapon /swapfile
再度 sudo swapon --show を実行すると swapfile が表示されます。free でも Swap 行に値が入ります。
sudo swapon --show
# NAME TYPE SIZE USED PRIO
# /swapfile file 1024M 20.3M -2

起動時に Swap を自動有効化
swapon は再起動で無効になり、/swapfile の確保だけが残ります。再起動後も自動で有効化するには /etc/fstab にエントリを追加します。
# 重要なファイルを編集する前にバックアップ
sudo cp /etc/fstab /etc/fstab.backup
# fstab を編集
sudo nano /etc/fstab
# 末尾に以下を追加:
/swapfile swap swap defaults 0 0
Swap の使用頻度を調整
カーネルには swappiness というパラメータ(0〜100)があり、Linux がどれだけ積極的にページを Swap へ移すかを制御します。値が大きいほど早めに Swap が使われます。値を下げると、本当に必要になるまでページを RAM に残します。
# 現在の値を確認(デフォルト: 60)
cat /proc/sys/vm/swappiness
# 10 に変更(即座に反映)
sudo sysctl vm.swappiness=10
# 再起動後も維持されるよう設定ファイルを編集(バックアップ推奨)
sudo nano /etc/sysctl.conf
# 末尾に以下を追加:
vm.swappiness=10
Swap を削除
Swap をやめたい場合は、追加した順序を逆にたどります。Swap を停止し、fstab のエントリを削除し、ファイルを消します。
# Swap を停止
sudo swapoff -v /swapfile
# Swap 設定を削除
sudo nano /etc/fstab
# 以下の行を削除:
/swapfile swap swap defaults 0 0
# 確保したファイルを削除
sudo rm /swapfile