EC2 の t2.micro(Amazon Linux 2023)は物理メモリが 1 GiB しかありません。同時アクセスが多いサイトを動かすとメモリが足りなくなり、Linux の OOM Killer(メモリ不足のときにプロセスを強制終了するしくみ)によって MySQL / MariaDB などのデータベースが止められ、WordPress に「データベース接続確立エラー」が表示されることがあります。インスタンスタイプを大きくすればメモリは増えますが、毎月の AWS の料金が上がります。この記事では、ディスク上にスワップファイルを作り、メモリ不足でプロセスが止まるのを防ぐ手順をまとめます。
【補足 スワップ】
スワップは、メモリが足りなくなったときに、あまり使われていないメモリの内容をディスクに一時的に書き出すしくみです。これにより、物理メモリを超える量のメモリを使っても、プロセスが強制終了されにくくなります。ただし、ディスクは物理メモリより読み書きがはるかに遅いため、スワップが頻繁に使われると動作は遅くなります。スワップは「メモリ不足で止まらないための保険」であり、メモリを増設するのと同じ効果があるわけではありません。
【補足 OOM Killer】
OOM Killer(Out Of Memory Killer)は Linux カーネルの機能です。物理メモリもスワップも足りなくなると、システム全体が止まるのを防ぐために、メモリを多く使っているプロセスを選んで強制終了します。WordPress のサーバーでは、メモリを多く使うデータベース(MySQL / MariaDB)が選ばれやすく、その結果 WordPress がデータベースにつながらなくなります。スワップを用意しておくと、メモリが足りなくなってもすぐには OOM Killer が動かなくなります。
OOM Killer が動いたかどうかは、次のコマンドで確認できます(再起動すると記録は消えます)。
$ sudo dmesg -T | grep -i "out of memory"
[Sun May 5 21:03:12 2024] Out of memory: Killed process 2345 (mariadbd) total-vm:1234567kB, anon-rss:345678kB, ...
(出力は例です。何も表示されなければ、起動してから OOM Killer は動いていません)
スワップファイルの作成手順
この記事では、物理メモリ 1 GiB に 2 GiB のスワップを追加します。合計 3 GiB までメモリを使えるようになるので、一時的にメモリの使用量が増えても、データベースが強制終了されにくくなります。
同じ手順は CentOS 7 でも使えます(CentOS 7 は 2024 年 6 月 30 日にサポートが終了しています)。
現在のメモリの確認
free コマンドと df コマンドで、スワップの状態とディスクの空き容量を確認します。
t2.micro に Amazon Linux 2023 を入れて WordPress をインストールした直後は、スワップが Swap: 0 0 0 となっていて、何も割り当てられていません。
※記事の作成時点(2024 年)では、新規アカウントは t2.micro を 12 か月間無料で使えました。2025 年 7 月 15 日以降に作成したアカウントでは、無料利用枠がクレジット制(最大 6 か月)に変わっています。
$ free
total used free shared buff/cache available
Mem: 972644 464180 73424 56204 435040 288452
Swap: 0 0 0
df コマンドで、スワップを作る前のディスクの使用状況を確認します。
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4096 0 4096 0% /dev
tmpfs 486320 0 486320 0% /dev/shm
tmpfs 194532 2864 191668 2% /run
/dev/xvda1 8310764 3307744 5003020 40% /
tmpfs 486324 0 486324 0% /tmp
tmpfs 97264 0 97264 0% /run/user/1000
/dev/xvda128 10202 1308 8894 13% /boot/efi
スワップファイルの作成
/swapfile という名前のファイルを作り、中身をゼロで埋めます。ブロックサイズ 64 MB × 32 ブロック = 2 GiB です。このファイルはルートボリューム(EBS)上に作られるので、ディスクの空き容量を 2 GiB 使います。
ブロックサイズ(bs)は、空いているメモリより小さくしてください。大きすぎると「memory exhausted」というエラーになります。
$ sudo dd if=/dev/zero of=/swapfile bs=64M count=32
32+0 records in
32+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 32.1526 s, 66.8 MB/s
/swapfile のアクセス権を設定します。
600 は、所有者(root)だけが読み書きでき、ほかのユーザーはアクセスできないことを意味します。
$ sudo chmod 600 /swapfile
/swapfile をスワップ領域として使えるように初期化します。
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=20121ed2-e71c-4ee4-b757-a6dcaf921874
スワップを有効にします。
$ sudo swapon /swapfile
有効になっているスワップの一覧を表示します。
$ sudo swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
このままでは再起動するとスワップが無効に戻るので、起動時に使うファイルシステムの一覧(/etc/fstab)に /swapfile を追加します。
$ echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
/swapfile swap swap defaults 0 0
追加されたことを確認します。最後の行に /swapfile が入っていれば OK です(tee の -a を付け忘れると、ファイルの中身が上書きされるので注意してください)。
$ cat /etc/fstab
#
UUID=974bfdce-a279-4e16-b3a4-114c0f95708b / xfs defaults,noatime 1 1
UUID=CE90-017B /boot/efi vfat defaults,noatime,uid=0,gid=0,umask=0077,shortname=winnt,x-systemd.automount 0 2
/swapfile swap swap defaults 0 0
スワップの確認
free コマンドで、物理メモリ(RAM)とスワップの使用状況を表示します。
スワップが「total: 2097148 used: 0 free: 2097148」と割り当てられていることを確認できます。
$ free
total used free shared buff/cache available
Mem: 972644 454000 94468 56204 424176 303368
Swap: 2097148 0 2097148
df コマンドで、ディスクの使用状況を表示します。2 GiB のスワップファイルを作ったので、ルートボリュームの使用率(Use%)が作成前の 40% から 66% に増えています。
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4096 0 4096 0% /dev
tmpfs 486320 0 486320 0% /dev/shm
tmpfs 194532 2864 191668 2% /run
/dev/xvda1 8310764 5405232 2905532 66% /
tmpfs 486324 0 486324 0% /tmp
tmpfs 97264 0 97264 0% /run/user/1000
/dev/xvda128 10202 1308 8894 13% /boot/efi

