Linux VPS にスワップ領域を追加する方法(512MB・1GB の小容量プラン向け)
512 MB や 1 GB のクラウドサーバーでは、データベース、PHP-FPM、パッケージ更新が重なるだけで簡単にメモリを使い切ります。するとカーネルの OOM killer がプロセスを停止し、多くの場合 MySQL や MariaDB が犠牲になります。Linux VPS にスワップ領域を追加すれば、ディスク上に退避先ができ、一時的なメモリのピークでサービスが落ちることはなくなります。このガイドでは Debian、Ubuntu、CentOS、Rocky Linux、AlmaLinux でスワップファイルを作成し、永続化して swappiness を調整する方法と、小容量プランでスワップが本当に役立つ場面を解説します。
ステップ1:現在のメモリとスワップを確認
まず RAM とスワップの量、ディスクの空き容量、そしてメモリ不足でカーネルがすでにプロセスを停止していないかを確認します。
free -h
swapon --show # no output = no swap yet
df -h / # make sure there is enough free disk space
# Has the kernel already killed processes for lack of memory?
journalctl -k | grep -i -E 'out of memory|killed process'
swapon --show にデバイスやファイルが表示される場合は、新たに追加せずステップ6 の調整だけで十分なこともあります。
ステップ2:適切なスワップサイズを決める
VPS におけるスワップは安全バッファであり、RAM の代わりにはなりません。一般的な小容量プランの目安は次のとおりです。
| プランのメモリ | 推奨スワップ | 備考 |
|---|---|---|
| 512 MB | 1 GB | 強く推奨 |
| 1 GB | 1 GB - 2 GB | DB やコントロールパネル利用時に推奨 |
| 2 GB | 1 GB | 安全バッファとして |
| 4 GB 以上 | 1 GB - 2 GB またはなし | 緊急用バッファのみ |
スワップファイルはサーバーの SSD 容量を使うため、ステップ1 で確認した空き容量を踏まえてサイズを決めてください。
ステップ3:fallocate または dd でスワップファイルを作成
fallocate は一瞬で領域を確保します。ファイルシステムによってはスワップ用に対応していないため、その場合は dd でブロックごとに書き込みます。時間はかかりますが確実です。ファイルは root のみ読み書きできるようにします。
# Fast method (ext4, XFS)
fallocate -l 1G /swapfile
# If fallocate fails, or swapon later reports "file has holes", use dd instead
rm -f /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
chmod 600 /swapfile
ls -lh /swapfile
swapon が「Operation not permitted」で失敗することがあります。ステップ4:スワップを初期化して有効化(mkswap と swapon)
mkswap がスワップの署名を書き込み、swapon で再起動なしにすぐ有効になります。
mkswap /swapfile
swapon /swapfile
swapon --show
free -h
ステップ5:/etc/fstab に登録してスワップを永続化
fstab に書かないと、再起動でスワップは消えます。ファイルをバックアップして 1 行追加し、いったんスワップを無効にしてから swapon -a で有効化してテストします。これは起動時と同じように fstab を読み込みます。
cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# Test the fstab entry without rebooting
swapoff /swapfile
swapon -a
swapon --show
ステップ6:VPS 向けに swappiness を調整
vm.swappiness は、カーネルがメモリページをどれだけ積極的にスワップへ移すかを決めます。デフォルトの 60 はデスクトップ向けです。サーバーでは 10 にすると、よく使うデータを RAM に残し、本当に逼迫したときだけスワップを使います。vfs_cache_pressure を下げると、ファイルシステムのメタデータキャッシュが少し長く保持されます。
cat /proc/sys/vm/swappiness # often 60 by default
# Apply now
sysctl vm.swappiness=10
sysctl vm.vfs_cache_pressure=50
# Keep after reboot
cat > /etc/sysctl.d/99-swap.conf <<'EOF'
vm.swappiness=10
vm.vfs_cache_pressure=50
EOF
sysctl --system
ステップ7:512 MB~1 GB プランでスワップが役立つ場面と限界
スワップが効果を発揮するのは一時的なピークです。apt upgrade や dnf update の実行、ソフトウェアのコンパイル、Composer や npm のインストール、夜間バックアップ、データベースが一時的にバッファを増やす場面などです。一方、常にプランを超えるメモリを必要とする負荷は解決できません。実際にスワップが頻発していないか確認しましょう。
# Watch the si (swap in) and so (swap out) columns for 10 seconds
vmstat 1 10
si と so がたまに 0 以外になる程度なら問題ありません。常に高い値なら、スラッシングが起きていて全体が極端に遅くなります。その場合はメモリ使用量を減らす(PHP-FPM のワーカー数やデータベースのバッファを減らす)か、VPS の RAM を増やしてください。JUSTG のクラウドサーバーは、クライアントエリアまたはチケットから RAM を追加できます。
ステップ8:スワップファイルのサイズ変更・削除
# Resize to 2 GB or remove swap
swapoff /swapfile
rm -f /swapfile
# To remove completely, also delete the fstab line:
sed -i '\|^/swapfile |d' /etc/fstab
# To resize, repeat Step 3 and Step 4 with the new size (fstab line stays)
よくある質問
スワップで SSD が消耗しませんか?
swappiness を 10 にしてピーク時だけ使うなら、書き込み量はわずかです。常に大量のスワップが発生するなら、必要なのはスワップではなく RAM です。
スワップファイルはスワップパーティションより遅いですか?
現在のカーネルでは差はほぼありません。VPS ではファイルの方が作成・変更・削除が簡単なため、本ガイドではスワップファイルを使っています。
スワップを追加しても MySQL が停止されます。
journalctl -k | grep -i oom と free -h を確認してください。スワップも使い切っている場合は、innodb_buffer_pool_size や Web サーバーのワーカー数を減らすか、プランの RAM を増やしましょう。
サーバーのスワップやメモリについてお困りの場合は、https://www.justg.com/submitticket.php からチケットを送信してください。JUSTG テクニカルサポートが対応いたします。