Amazon Linux 2023(EC2 t2.micro)でスワップファイルを作ってメモリ不足を防ぐ手順

メモリ不足でDBを止めない! Amazon Linux 2023でスワップを作る手順 Linux Server

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
タイトルとURLをコピーしました