iOS&Androidスマートフォン開発(Swift/Kotlin/React-Native) および Next.js/LaravelをはじめとしたWeb開発ならば、ぜひ創業13年の弊社にお任せください。ワンストップでお届けします。お問合せはこちらから

Amazon Linux 2023にスワップ領域を追加する手順。メモリ2GBの小さいインスタンスを延命する

  2026年08月30日 11:30 / - PV

yuku_tasのアイコン

こんにちは、Webサービス開発者のyuku_tasです。

簡単なプロフィール: MoldSpoon Inc.代表。開業から15年、業界に携わって20年。Webサイト/iOS/Androidアプリ開発から、データ分析業務・コンサル業務、ベンチャーから保険会社まで様々な案件を個人会社の形で請け負ってまいりました。詳しくはこちら

はじめに

Amazon Linux 2023のインスタンスは、デフォルトではスワップ領域が一切ありません

free -hで確認すると一目瞭然です。

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           1.8Gi       1.2Gi       120Mi        16Mi       500Mi       420Mi
Swap:             0B          0B          0B    ←ゼロ

物理メモリを使い切った瞬間、OOM killerがメモリを一番食っているプロセスを問答無用で殺しに来ます。 MySQLが落ちる、PHPのバッチが落ちる、ウィルススキャンが落ちる...小さいインスタンスの「よく分からない突然死」はだいたいこれです。

実際、当ブログでもClamAVをAmazon Linux 2023に導入した際、メモリ2GBのマシンでスキャンが固まる問題に遭遇しました。

本記事では、スワップファイルを追加して再起動後も維持されるようにする手順をまとめます。

手順

1. スワップファイルを作成する

メモリ2GBのインスタンスなら、まずは2GBのスワップを作るのが無難です。

sudo dd if=/dev/zero of=/swapfile bs=128M count=16

128MB × 16 = 2GBです。bs=1M count=2048でも同じですが、ブロックサイズを大きくした方が速く終わります。

2. 権限を絞る

スワップファイルにはメモリの中身(=機密情報を含みうる)が書き出されるため、root以外読めないようにします。これをやらないとmkswapが警告を出します。

sudo chmod 600 /swapfile

3. スワップ領域として初期化して有効化

sudo mkswap /swapfile
sudo swapon /swapfile

この時点で有効になっています。確認しましょう。

$ swapon --show
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           1.8Gi       1.2Gi       120Mi        16Mi       500Mi       420Mi
Swap:          2.0Gi          0B       2.0Gi    ←増えた

4. 再起動後も有効になるよう永続化する

swaponその場限りで、再起動すると消えます。/etc/fstabに1行追加して永続化します。

echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

fstabの書き間違いは起動不能の原因になるので、追記後に必ず検証コマンドを通しておきましょう。

sudo mount -a   # エラーが出なければOK

チューニング: swappiness

swappinessは「どれくらい積極的にスワップを使うか」(0〜100)の設定です。

cat /proc/sys/vm/swappiness   # デフォルトは60

スワップはディスクなのでメモリよりずっと遅く、常用するものではなく保険です。Webサーバ/DB用途なら、値を下げて「本当に苦しいときだけ使う」寄りにするのが定石です。

# その場で変更
sudo sysctl vm.swappiness=10

# 永続化
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

注意点

スワップは「遅くなるが死なない」ための保険

スワップに乗った処理は体感できるレベルで遅くなります。「スワップを使い始めたら、本来はスケールアップのサイン」と捉えてください。恒常的にスワップが数百MB使われている状態なら、素直に上のインスタンスタイプへ。

t系(バースト)インスタンスではディスクI/Oにも注意

スワップの実体はEBSへのI/Oです。スワップが激しく使われる状況では EBSのバーストバランスも削っていくため、最悪「メモリ不足 + ディスクも遅い」の二重苦になります。繰り返しになりますが、あくまでOOM killer対策の保険として使いましょう。

インスタンスストアがあるなら、そちらに置く手も

エフェメラルディスク(インスタンスストア)付きのインスタンスなら、消えてもよいスワップはそちらに置く方がEBSのI/O課金を食いません(再起動時の再作成スクリプトが必要になります)。

まとめ

sudo dd if=/dev/zero of=/swapfile bs=128M count=16
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

この5行で、小さいインスタンスの「突然死」リスクはかなり下げられます。ClamAVのような一時的にメモリを大食いするミドルウェアを 動かす前には、特に入れておくのがおすすめです。


この記事が何かのお役に立てれば幸いです。
最後までお読みいただきありがとうございました!

Share Me!