the KodeLab

Linux Swap とは?Debian/Ubuntu で Swap を追加する方法|swapfile fstab swappiness

2,559 文字 7 分で読めます
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 有効化後の free 出力
Swap 有効化後の free 出力

起動時に 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