2026年5月31日
2026年5月31日
VPSのスワップ領域を設定してメモリ不足を解消する方法(WordPressサーバーでの目安と注意点)
メモリが少ないVPSでWordPressを動かしていて、MySQLが落ちる・PHPが強制終了されるといった症状があるなら、スワップファイルを作るとメモリの急な不足を吸収でき、プロセスが強制終了されにくくなります。ただしスワップはメモリの代わりではなく、あくまで一時的な逃げ場です。この記事では、スワップが必要かどうかの見極め方、スワップファイルの作り方と永続化、swappiness の調整、そしてスワップだけでは解決しないケースの対処までを説明します。
まず現状を確認する
最初に、メモリとスワップの状態を確認します。
free -h
swapon --show
free -h の Swap の行がすべて 0 で、swapon --show が何も表示しなければ、スワップは設定されていません。クラウド向けのOSイメージでは、スワップなしで起動する構成が多く見られます。
次に、実際にメモリ不足が起きているかを確認します。Linux はメモリが足りなくなると、OOM Killer という仕組みでメモリを多く使うプロセスを強制終了します。その記録はカーネルログに残ります。
sudo journalctl -k | grep -i -E "out of memory|oom"
# journald を使っていない環境では
sudo dmesg -T | grep -i -E "out of memory|oom"
「Out of memory: Killed process 1234 (mysqld)」のような行があれば、メモリ不足でプロセスが止められています。WordPress では、データベースが落ちて「データベース接続確立エラー」が表示されるのが典型的な症状です。
スワップで解決できること・できないこと
スワップは、使われていないメモリの中身をディスクに退避させ、空いたメモリを他の処理に回す仕組みです。
解決しやすいケース
- アクセスの集中やプラグインの更新、バックアップ処理などで、一時的にメモリ使用量が跳ね上がる
- 起動はしたが普段はほとんど使われないプロセス(常駐しているだけのサービスなど)がメモリを占めている
解決しにくいケース
- 普段からメモリを使い切っていて、スワップが常に読み書きされている
- PHP-FPM の同時実行数や MySQL のバッファが、メモリ量に対して大きすぎる
後者の状態でスワップを足すと、プロセスが落ちる代わりに、ディスクの読み書き待ちでサイト全体が極端に遅くなります。この場合はスワップではなく、設定の見直しやメモリの増強が必要です(後半で触れます)。
スワップを作れない環境がある
OpenVZ や LXC などのコンテナ型の仮想化を使ったVPSでは、利用者がスワップを作れないことがあります。後述の swapon で「Operation not permitted」と出る場合はこのケースで、事業者側の仕様に従うしかありません。仮想化の方式は systemd-detect-virt で確認できます。KVM などのハイパーバイザー型の仮想化を使ったVPSであれば、通常は作成できます。
スワップファイルの作り方
専用のパーティションを切る方法もありますが、VPSでは後からサイズを変えやすいスワップファイルが扱いやすいです。作業前に、ディスクの空き容量を df -h / で確認しておきます。
サイズの目安
メモリが1〜2GBの小さなVPSでWordPressを動かす場合、まずはメモリと同じ程度(1〜2GB)から始めるのが一般的です。大きくしすぎてもディスクを圧迫するだけで、遅さの原因が見えにくくなります。休止状態(ハイバネーション)を使わないサーバーでは、メモリの2倍といった古い目安にこだわる必要はありません。
作成と有効化
2GBのスワップファイルを作る例です。
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show
free -h
chmod 600 は、メモリの中身が書き出されるファイルを root 以外が読めないようにするためです。これを省くと swapon が警告を出します。
swapon で「skipping - it appears to have holes」と表示された場合は、ファイルシステムが fallocate で作ったファイルをスワップとして扱えていません。いったん削除して、dd で作り直します。
sudo rm /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
ルートのファイルシステムが Btrfs の場合は、スワップファイルに特別な扱いが必要です。新しめの btrfs-progs には btrfs filesystem mkswapfile というコマンドがあるので、使っている環境のドキュメントで確認してください。
再起動後も有効にする
swapon だけでは再起動で元に戻るため、/etc/fstab に追記します。fstab の書き間違いは起動に影響するため、先にバックアップを取ります。
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --show
swapon -a で fstab の内容から有効化できれば、記述は正しく読めています。VPSによっては再起動に失敗したときにコンソールからしか操作できなくなるため、事業者の管理画面からコンソール接続できることを事前に確認しておくと安心です。
swappinessを調整する
vm.swappiness は、メモリに余裕があるうちからどの程度積極的にスワップを使うかの傾向を決める値です。多くのディストリビューションの既定値は 60 です。WordPress のようにデータベースとPHPがメモリを使うサーバーでは、スワップを「本当に足りないときの逃げ場」にしたいので、低めの値にするのが一般的です。
cat /proc/sys/vm/swappiness
echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
cat /proc/sys/vm/swappiness
0 にするとスワップがほとんど使われなくなり、OOM Killer が先に動きやすくなります。まずは 10 前後から試し、様子を見て調整します。
スワップが効いているかを確認する
設定後は、しばらく運用してからスワップの使われ方を確認します。
vmstat 5
si(スワップからの読み込み)と so(スワップへの書き出し)の列が、普段はほぼ 0 で、負荷が高いときだけ増えるなら、スワップが逃げ場として機能しています。常に数値が出続けている場合は、メモリそのものが足りていません。
スワップだけでは足りないときの対処
スワップが常に使われている場合は、メモリを使う側を見直します。
- PHP-FPM の同時実行数:
pm.max_childrenが大きすぎると、アクセスが集中したときにPHPのプロセスがメモリを使い切ります。1プロセスあたりの使用量をpsなどで測り、使えるメモリから逆算して上限を決めます。 - MySQL / MariaDB のバッファ:
innodb_buffer_pool_sizeがメモリに対して大きすぎないかを確認します。小さなVPSでは、Webサーバーや PHP と分け合う前提で控えめに設定します。 - 不要なサービスやプラグイン:使っていない常駐サービスを止め、重い処理をするプラグインを見直します。ページキャッシュを導入すると、PHPとデータベースの処理自体が減ります。
- プランの変更:上記を見直しても足りなければ、メモリの多いプランへの変更が根本的な対策になります。
設定を変える前には、該当する設定ファイルのバックアップを取り、変更後は負荷の高い時間帯にメモリとスワップの状態を確認します。
スワップファイルを削除する場合
不要になった場合や作り直す場合は、次の順で外します。
sudo swapoff /swapfile
sudo sed -i.bak '/^\/swapfile /d' /etc/fstab
sudo rm /swapfile
swapoff はスワップの中身をメモリに戻すため、メモリに余裕がないときに実行すると時間がかかったり失敗したりします。アクセスの少ない時間帯に行います。
なお、ディスクを使わずメモリを圧縮してスワップのように使う zram という方式もあります。ディスクの読み書きが遅いVPSで検討する価値はありますが、ディストリビューションごとに導入方法が異なるため、利用中のOSのドキュメントを確認してください(2026年10月現在)。
まとめ
free -hとswapon --showでスワップの有無を、カーネルログで OOM Killer の記録を確認します。- スワップファイルは
fallocate(だめならdd)→chmod 600→mkswap→swaponで作り、fstab に追記して永続化します。fstab はバックアップしてから編集します。 vm.swappinessを 10 前後に下げ、スワップを一時的な逃げ場として使います。vmstatで si / so が常に出ているなら、PHP-FPM・MySQL の設定見直しやメモリ増強が必要です。