AWS EC2でswap領域を設定するベストプラクティス完全ガイド【2026年版】

2019年5月20日


AWS EC2インスタンスはデフォルトでswap領域が存在せず、メモリ不足になるとOOM Killerがプロセスを強制終了します。本番環境でこの状況を回避するには、適切なswap設定が不可欠です。

このガイドでは、AWS公式ナレッジセンターが推奨するswapfile方式を中心に、Amazon Linux 2023のzram対応・インスタンスタイプ別の推奨サイズ・vm.swappinessチューニング・起動時の自動有効化まで、一連の手順を詳しく解説します。

筆者はt3.microやt4g.smallなど小メモリのEC2インスタンスで本手順を実際に検証・運用しています。

{{IMAGE: EC2インスタンスのメモリ使用状況とswap領域が有効になっている状態のtopコマンド出力例}}


この記事で分かること

  • AWS EC2にswap領域が必要な理由と注意点
  • swapfile方式の作成・設定・永続化手順(Amazon Linux 2 / Amazon Linux 2023 / Ubuntu対応)
  • インスタンスタイプ別の推奨swapサイズ
  • Amazon Linux 2023のzramとswapfileの使い分け
  • vm.swappinessの最適値とEC2での推奨設定
  • よくあるトラブルと解決策

前提条件

このガイドは以下の環境で動作を確認しています。

  • OS: Amazon Linux 2、Amazon Linux 2023、Ubuntu 22.04 LTS
  • インスタンスタイプ: t3.micro、t3.small、t4g.small(他のインスタンスタイプにも適用可能)
  • 必要な権限: sudo(root権限)
  • 前提知識: SSHでEC2に接続できること、基本的なLinuxコマンド操作
# 現在のメモリ・swap状況を確認するコマンド
free -h

# 期待する出力(swap未設定の場合)
#               total        used        free      shared  buff/cache   available
# Mem:          967Mi       234Mi       132Mi       2.0Mi       600Mi       599Mi
# Swap:            0B          0B          0B

なくてもOK: EBS追加ボリュームは不要です。このガイドではルートボリューム上にswapfileを作成する方法を採用しています。


全体の流れ

このガイドは以下の5ステップで構成されています。

  1. swapファイルの作成 — 約2分
  2. swapの有効化と権限設定 — 約1分
  3. 起動時の自動有効化(fstab設定) — 約1分
  4. vm.swappiness のチューニング — 約2分
  5. Amazon Linux 2023のzram対応(任意) — 約3分

{{IMAGE: EC2のswap設定手順全体フロー図(swapファイル作成→有効化→永続化→チューニング)}}


AWS EC2にswap領域が必要な理由

EC2はデフォルトでswapがない

AWS EC2インスタンス(大部分のインスタンスタイプ)はswap領域なしで起動します。これはAWSが意図的に行っている設計で、EBSのI/Oを最小化しパフォーマンスを安定させる目的があります。

しかし、swap無しの状態でメモリが枯渇すると:

  • OOM Killer(Out-of-Memory Killer) が起動し、重要なプロセスを強制終了
  • Webサーバーやデータベースが突然停止
  • 場合によってはインスタンス全体が応答不能になる

小メモリインスタンス(t3.micro: 1GiB、t3.nano: 512MiB)でNode.jsやRuby on Railsのビルドを行う場合など、一時的にメモリを大量消費するケースでswapは特に有効です。

swapfile方式が推奨される理由

EC2でswapを設定する方法は主に2つあります:

方式 説明 メリット デメリット
swapfile方式 ルートEBS上にファイルとして作成 手順が簡単、追加コストなし I/O性能がやや落ちる
EBSパーティション方式 別途EBSを追加してパーティション化 I/O性能が高い EBSコスト追加、手順が複雑
インスタンスストア方式 エフェメラルストレージを利用 無料、高速 インスタンス停止でデータ消失、対応インスタンスが限定的

AWSの公式ナレッジセンター(AWS re:Post)ではswapfile方式を推奨しています。追加コストなしで設定でき、ほとんどのユースケースで十分な性能が得られます。


インスタンスタイプ別の推奨swapサイズ

Red Hat(RHEL)の推奨ガイドラインとAWSの実運用経験をもとにした推奨サイズです:

インスタンスタイプ メモリ 推奨swapサイズ
t2.nano / t3.nano 512MiB 1GiB
t2.micro / t3.micro / t4g.micro 1GiB 2GiB
t2.small / t3.small / t4g.small 2GiB 2GiB
t2.medium / t3.medium 4GiB 2GiB
t3.large / t3a.large / t4g.large 8GiB 4GiB
m5.large / m6g.large 8GiB 4GiB(任意)
m5.xlarge以上 16GiB以上 通常不要

一般的なルール(Red Hat推奨):

  • RAM 2GiB未満 → RAM × 2のswap
  • RAM 2GiB〜8GiB → RAM と同量のswap
  • RAM 8GiB〜64GiB → RAM × 0.5のswap
  • RAM 64GiB以上 → 4GiB(最低限)

注意: 大規模インスタンスでswapが頻繁に使用される場合はインスタンスタイプのアップグレードを検討してください。swapはあくまでバッファであり、常時スワッピングが発生する状態は根本的なリソース不足のサインです。


ステップ1: swapファイルの作成

swapファイルを作成する方法は2つあります。ファイルシステムの種類によって使えるコマンドが異なります。

方法A: fallocateコマンドを使う(推奨・ext4/xfs)

fallocateは実際にデータを書き込まずにファイルサイズを確保するため高速です。

# 2GiBのswapファイルを作成(サイズは環境に合わせて調整)
sudo fallocate -l 2G /swapfile

注意: btrfsファイルシステムではfallocateが使えません。その場合は方法Bを使用してください。

方法B: ddコマンドを使う(汎用・btrfsでも動作)

# 2GiBのswapファイルを作成(bs=128M × count=16 = 2GiB)
sudo dd if=/dev/zero of=/swapfile bs=128M count=16

# 進捗確認付きで実行する場合
sudo dd if=/dev/zero of=/swapfile bs=128M count=16 status=progress

bs(ブロックサイズ)とcountの組み合わせでサイズを指定します:

目的サイズ コマンド例
1GiB bs=128M count=8
2GiB bs=128M count=16
4GiB bs=128M count=32
8GiB bs=128M count=64

ファイル作成の確認

ls -lh /swapfile

# 期待する出力
# -rw-r--r-- 1 root root 2.0G Apr  7 10:00 /swapfile

ステップ1完了の確認: /swapfile が指定サイズで作成されていること


ステップ2: swapの有効化と権限設定

セキュリティ上の権限設定

swapファイルはrootのみが読み書きできるように設定します。これはLinuxのセキュリティベストプラクティスです。

# root以外のアクセスを拒否
sudo chmod 600 /swapfile

# 権限確認
ls -lh /swapfile
# 期待する出力
# -rw------- 1 root root 2.0G Apr  7 10:00 /swapfile

なぜ必要か: swap領域には実行中プロセスのメモリ内容(パスワード等を含む可能性)が書き込まれます。chmod 600でrootのみがアクセスできる状態にすることがセキュリティ上必須です。

swapファイルとしてフォーマット

# mkswapでswap領域を初期化
sudo mkswap /swapfile

# 期待する出力
# Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
# no label, UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

swapを有効化

# swaponでswapを有効化
sudo swapon /swapfile

# swap状況を確認
sudo swapon --show

# 期待する出力
# NAME      TYPE SIZE USED PRIO
# /swapfile file   2G   0B   -2
# free -hでも確認できます
free -h

# 期待する出力
#               total        used        free      shared  buff/cache   available
# Mem:          967Mi       234Mi       132Mi       2.0Mi       600Mi       599Mi
# Swap:         2.0Gi          0B       2.0Gi

{{IMAGE: free -hコマンドでswap領域2GiBが有効になっている状態のターミナル出力}}

ステップ2完了の確認: free -hでSwap行に値が表示されること


ステップ3: 起動時の自動有効化(fstab設定)

現時点ではインスタンスを再起動するとswapが無効になります。/etc/fstabに設定を追加して永続化します。

fstabのバックアップ(重要)

# 必ずバックアップを取ってから編集してください
sudo cp /etc/fstab /etc/fstab.bak

fstabに追記

# echoでfstabに追記(直接編集でも可)
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

またはsudo vim /etc/fstabで直接編集して以下の行を末尾に追加:

/swapfile none swap sw 0 0

各フィールドの意味:

フィールド 意味
デバイス /swapfile swapファイルのパス
マウントポイント none swapはマウントポイント不要
ファイルシステム swap swap用
オプション sw swap有効化
dump 0 バックアップ対象外
pass 0 fsckスキャン対象外

設定の確認

# fstabの設定が正しいか確認
sudo cat /etc/fstab | grep swap

# 再起動後もswapが有効か確認するには再起動後に確認
# sudo reboot  ← 実行後に下記で確認
# free -h
# sudo swapon --show

よくあるミス: fstabの書式ミスがあるとインスタンスが起動しなくなります。コピー&ペーストで追記し、sudo mount -aで事前確認することをお勧めします。

# fstabの検証コマンド(エラーが出ないことを確認)
sudo mount -a

ステップ3完了の確認: sudo mount -aでエラーが出ないこと。再起動後もfree -hでswapが表示されること


ステップ4: vm.swappiness のチューニング

vm.swappinessは、Linuxカーネルがいつswapを使用するかの積極性を0〜100の値で制御するパラメータです。

swappinessの意味

挙動
0 物理メモリが枯渇するまでswapを使用しない
10 swapを極力使わず、RAMを優先
60 Linuxデフォルト値。バランス型
100 積極的にswapを使用

EC2での推奨値

EC2ではEBSのI/O性能がRAMより大幅に劣るため、swappinessを低く設定することでI/Oを最小化できます。

# 現在の値を確認
cat /proc/sys/vm/swappiness
# デフォルト: 60

# 一時的に変更(再起動後にリセットされる)
sudo sysctl vm.swappiness=10

# 確認
cat /proc/sys/vm/swappiness
# 10

永続的なswappiness設定

# /etc/sysctl.confに追記
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

# または /etc/sysctl.d/ ディレクトリに個別ファイルを作成(推奨)
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf

# 設定を即時反映
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf

# 確認
cat /proc/sys/vm/swappiness
# 10

vm.swappinessの推奨値について: AWS公式は特定の値を明記していませんが、多くのAWSエンジニアやDevelopersIOのガイドでは10〜20を推奨しています。データベースサーバーの場合は1〜5にする場合もあります。

{{IMAGE: htopやtopコマンドでswap使用量と物理メモリ使用量がモニタリングされているスクリーンショット}}

ステップ4完了の確認: cat /proc/sys/vm/swappinessが設定した値(例: 10)を表示すること


ステップ5: Amazon Linux 2023のzram対応

Amazon Linux 2023(AL2023)は、メモリ512MiB未満のインスタンス(t4g.nano等)でzramが自動有効化されます。

zramはRAM上に圧縮ブロックデバイスを作成するswap方式で、EBSへのI/Oが不要な反面、CPU負荷が増加します。本番用途でEBSベースのswapfileと共存させる方法を紹介します。

現在のswap状態確認

# AL2023でのswap状態確認
sudo swapon --show

# zramが有効な場合の出力例
# NAME       TYPE      SIZE USED PRIO
# /dev/zram0 partition 452M   0B  100

AL2023でswapfileを追加する

AL2023では標準のswapfile作成手順が動作します(zramと共存可能):

# swapfileを作成(手順はステップ1〜3と同様)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 両方のswapが有効になっていることを確認
sudo swapon --show
# NAME       TYPE      SIZE USED PRIO
# /dev/zram0 partition 452M   0B  100
# /swapfile  file        2G   0B   -2

zramを無効化してswapfileのみを使用する場合

パフォーマンス最適化のためzramを無効化してEBSベースのswapfileのみを使いたい場合:

# zramの状態確認
systemctl status systemd-zram-setup@zram0.service

# zramを一時的に無効化
sudo swapoff /dev/zram0

# 再起動時もzramを無効化
sudo systemctl disable systemd-zram-setup@zram0.service

# swapfileがfstabに設定されていることを確認
cat /etc/fstab | grep swap
# /swapfile none swap sw 0 0

どちらを選ぶべきか: メモリが極めて少ない(512MiB以下)インスタンスではzramが有効な選択肢です。1GiB以上のインスタンスではzramを無効化し、EBSベースのswapfileを推奨します。


スワップの使用状況モニタリング

リアルタイム確認

# swap使用量をリアルタイムで確認
watch -n 5 'free -h'

# 詳細なswap情報
vmstat 1 5

# topコマンドでの確認(SIがswap in、SOがswap out)
top
# topのKiB Swap行を確認

どのプロセスがswapを使用しているか確認

# swapを使用しているプロセスのリスト
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3 "\n"}' $file 2>/dev/null;
done | sort -k 2 -n -r | head -20
# smemコマンドを使う場合(インストールが必要)
sudo yum install smem -y    # Amazon Linux
sudo apt install smem -y    # Ubuntu
smem -r -k | head -20

{{IMAGE: vmstatコマンドやtopコマンドでswapのsi/soカラムを確認している状態のスクリーンショット}}


トラブルシュート

症状 原因 解決策
fallocate: fallocate failed: Operation not supported btrfsファイルシステムに未対応 ddコマンドを使用する
swapon: /swapfile: insecure permissions 0644, 0640 suggested ファイルの権限が不適切 sudo chmod 600 /swapfile を実行
再起動後にswapが無効 fstabへの追記が漏れている /etc/fstab/swapfile none swap sw 0 0を追加
mount: /etc/fstab: parse error fstabの書式が正しくない /etc/fstab.bakからリストアしてやり直す
mkswap: error: swap area needs to be at least 40 KiB swapファイルが小さすぎる 最低でも64MiB以上で作成する
スワッピングが頻発してパフォーマンス低下 メモリが根本的に不足 インスタンスタイプのアップグレードを検討
AL2023でzramとswapfileが競合 優先度(PRIO)の問題 swapon -p 10 /swapfileで優先度を調整

swapfile削除の手順

不要になったswapfileを削除する場合の手順です。

# swapを無効化
sudo swapoff /swapfile

# fstabから削除
sudo sed -i '/\/swapfile/d' /etc/fstab

# ファイルを削除
sudo rm /swapfile

# 確認
free -h
# Swap行が0Bになっていることを確認

まとめ

このガイドでは、AWS EC2インスタンスへのswap領域設定について、以下の手順で解説しました。

  • ステップ1: swapファイルの作成(fallocateまたはddコマンド)
  • ステップ2: セキュリティ権限設定(chmod 600)とswap有効化(mkswapswapon
  • ステップ3: /etc/fstabへの追記による起動時自動有効化
  • ステップ4: vm.swappiness=10によるEC2向けパフォーマンスチューニング
  • ステップ5: Amazon Linux 2023のzram対応(必要な場合)

EC2のswapfileはOOM Killerによるプロセス強制終了の防止や、一時的なメモリスパイク対策として有効です。ただし、swap領域は根本的なメモリ不足の解決策ではありません。スワッピングが日常的に発生するようであれば、より大きなインスタンスタイプへのアップグレードを検討してください。

インスタンスタイプ別の推奨設定を参考に、運用環境に合ったswapサイズとvm.swappiness値を設定することで、EC2インスタンスの安定稼働を実現できます。


関連記事

AWS,PC関連,開発

Posted by GENDOSU