Linuxサーバーのスワップ領域を設計・拡張する方法|物理メモリ別の推奨容量とswapfile作成

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, ディスク操作 > Linuxサーバーのスワップ領域を設計・拡張する方法|物理メモリ別の推奨容量とswapfile作成
「本番サーバーのメモリが枯渇して、OOM Killerに大事なプロセスを落とされた」「スワップを設定しておけばよかった」

Linuxサーバーを運用していると、こんな場面に一度は直面します。スワップ領域を適切に設計・設定しておくことは、サーバーの安定稼働を支える重要な作業です。

この記事では、スワップの基本的な仕組みから、物理メモリ容量別の推奨サイズ、swapパーティションとswapfileの使い分け、swapfileの実際の作成手順、swappinessのチューニング、クラウド環境での注意点、監視と容量超過対処まで、RHEL 9.4 / Ubuntu 24.04 LTS での動作確認をもとに解説します。

この記事のポイント

・RAM 8GB 以下ではRAMと同容量、16GB 以上はRAMの半分を目安にスワップを確保する
・クラウド(EC2など)ではデフォルトでスワップが無効のため、手動でswapfileを作成する必要がある
・swappiness の推奨値は一般サーバー=10~30、データベースサーバー=1~10
・swapon --show と free -h でスワップの使用状況をリアルタイムに確認できる



「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

スワップ領域とは何か:OOM Killer から守る最後の砦

スワップ(swap)領域は、物理メモリが不足したときにディスクの一部をメモリの代わりとして使う仕組みです。Linuxカーネルが自動的にメモリページをディスクに退避(スワップアウト)し、必要になった時点で物理メモリに戻す(スワップイン)動作をします。

スワップが存在しない状態で物理メモリが枯渇すると、カーネルの OOM Killer(Out of Memory Killer) が起動し、メモリを大量消費しているプロセスを強制終了します。Webアプリケーションや重要なデーモンが突然落ちる最も多い原因のひとつが、このOOM Killerです。

ただし、スワップはメモリの代替とはいえ、ディスクI/Oが伴うため物理メモリよりも遥かに遅いです。スワップを大量に使い始めた状態(スワップスラッシング)は深刻なパフォーマンス低下を引き起こします。スワップはあくまで「緊急の時間稼ぎ」であり、根本的な解決は物理メモリの増設またはアプリの最適化です。

スワップが必要な場面:一時的なメモリスパイクへの緩衝、ハイバネーション(サスペンド・トゥ・ディスク)
スワップを当てにしてはいけない場面:通常稼働時のメモリ代替、常時高負荷なDBサーバー

物理メモリ別のスワップ推奨容量

スワップの推奨容量はOS・用途・時代によって変化していますが、現在の一般的なガイドラインは以下のとおりです。

物理メモリ(RAM) 推奨スワップ容量 備考
2GB 以下 RAM の 2倍 最低限の保護。ハイバネーション使用時も同様
2GB ~ 8GB RAM と同容量 一般的なWebサーバー・開発サーバー向け
8GB ~ 64GB RAM の半分(最低 8GB) メモリが潤沢なサーバー向けの標準推奨
64GB 以上 4GB ~ 8GB(固定) スワップへの依存を排除し、OOM対策を目的とした最小設定

ハイバネーション(サスペンド・トゥ・ディスク)を使用する場合は、物理メモリ全体をディスクに退避する必要があるため、スワップはRAMと同容量以上が必須です。クラウドや仮想サーバーではハイバネーションを使わないケースが大半なので、この条件は通常気にしなくて構いません。

物理RAMの容量確認には以下のコマンドを使います。

# 物理メモリ容量を確認 free -h # total used free shared buff/cache available # Mem: 7.6Gi 2.1Gi 3.2Gi 38Mi 2.3Gi 5.1Gi # Swap: 0 0 0 # 詳細なハードウェア情報でRAMスロット構成を確認 sudo dmidecode -t memory | grep -E "Size:|Type:|Speed:"

dmidecode でハードウェア情報を取得して物理メモリの構成(スロット数・モジュール容量)を確認しておくと、将来の増設計画にも役立ちます。

swapパーティション vs swapfile:どちらを選ぶべきか

Linuxのスワップには2種類の実装方法があります。

種類 特徴 メリット デメリット
swapパーティション 専用パーティションをスワップ領域として使用 わずかに高速。断片化なし サイズ変更が困難(再パーティションが必要)
swapfile 既存ファイルシステム上にファイルを作成 後から作成・削除・サイズ変更が容易 ファイルシステムのオーバーヘッドがわずかにある

現在の推奨はswapfileです。 SSD全盛の現代では、swapパーティションとswapfileの速度差は体感できるほどではありません。一方で、クラウド環境やVMではOS稼働後にスワップを追加するケースが多く、swapfileの方が柔軟に対応できます。

swapパーティションを選ぶケース:
・OSインストール時に設計として確定している場合
・ハイバネーションを確実に動作させたい場合(カーネルが専用パーティションを要求するディストリビューションがある)

swapfileを作成する手順

最も一般的な作業手順を示します。RHEL 9 / Ubuntu 24.04 LTS のどちらでも同じコマンドで動作します。

1. swapfileを作成する

4GBのswapfileを作成する例です。

# dd でゼロ埋めファイルを作成(確実な方法) sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 # 4096+0 records in # 4096+0 records out # 4294967296 bytes (4.3 GB, 4.0 GiB) copied, 8.42 s, 510 MB/s # fallocate を使う場合(高速だがbtrfsは非対応) sudo fallocate -l 4G /swapfile

注意:btrfsファイルシステムでのswapfile

btrfs(Ubuntu 22.04のデフォルト)では fallocate で作成したswapfileは動作しません。dd で作成するか、btrfs の COW(Copy-On-Write)を無効化した専用サブボリュームを使う必要があります。

2. パーミッションを設定する

swapfileは root のみ読み書き可能にする必要があります。

sudo chmod 600 /swapfile ls -la /swapfile # -rw------- 1 root root 4294967296 5月 17 11:00 /swapfile

3. スワップ領域として初期化する

sudo mkswap /swapfile # Setting up swapspace version 1, size = 4 GiB (4294963200 bytes) # no label, UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890

4. スワップを有効化する

sudo swapon /swapfile # 有効化を確認 swapon --show # NAME TYPE SIZE USED PRIO # /swapfile file 4096M 0B -2 free -h # total used free shared buff/cache available # Mem: 7.6Gi 2.1Gi 3.2Gi 38Mi 2.3Gi 5.1Gi # Swap: 4.0Gi 0B 4.0Gi

5. 再起動後も有効にする(fstab設定)

現在の設定は再起動すると無効になります。永続化するには /etc/fstab に追記します。

# fstabにswapfileを追記 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # fstabの確認 cat /etc/fstab | grep swap # /swapfile none swap sw 0 0

fstabの書式や他のエントリについては mount コマンドの使い方 も合わせて参照してください。マウントオプションの意味を理解しておくと、スワップ設定のトラブルシュートに役立ちます。

6. 設定を確認・テストする

# swapfileを一度無効化してfstabで再有効化できるか確認 sudo swapoff /swapfile sudo swapon -a # fstabの全スワップを有効化 swapon --show # NAME TYPE SIZE USED PRIO # /swapfile file 4096M 0B -2

swappinessのチューニング:スワップの使いやすさを調整する

swappiness は、カーネルがスワップをどの程度積極的に使用するかを決めるパラメータです。

値の範囲:0 ~ 200(カーネル3.5以降は200まで)
デフォルト値:60(Ubuntu/RHEL共通)
0 に近い:物理メモリが尽きる直前まで絶対にスワップしない
100 以上:積極的にスワップを使い、物理メモリを空けようとする

# 現在のswappiness値を確認 cat /proc/sys/vm/swappiness # 60 # 一時的に変更(再起動で元に戻る) sudo sysctl vm.swappiness=10 # 永続化(再起動後も有効) echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swappiness.conf sudo sysctl -p /etc/sysctl.d/99-swappiness.conf

用途別の推奨値:

一般的なWebサーバー:10 ~ 30(スワップへの移行を抑制し、応答速度を優先)
データベースサーバー(MySQL/PostgreSQL):1 ~ 10(スワップ使用を最小化。DBのバッファキャッシュを物理メモリに維持)
デスクトップ環境:60(デフォルト)または 40(体感速度重視)

クラウド環境(EC2/GCP/Azure)でのスワップ設定

クラウドのVMインスタンスはデフォルトでスワップが無効です。理由は、クラウドプロバイダーはRAMと同等のディスクI/O保証ができないため、スワップを公式には推奨していないからです。

それでもスワップが必要なケースでは、swapfileを手動で作成します。AWS EC2(Amazon Linux 2023)での手順は以下のとおりです。

# EC2上でのswapfile作成(例:2GBのt3.smallなど) 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

クラウド環境でのスワップに関する注意事項:

EBS(汎用SSD gp3):バースト上限(最大3,000 IOPS)があるため、スワップスラッシングが起きると他のディスクI/Oも詰まる
インスタンスストア:高速だがインスタンス停止で消滅するため永続化不可
根本対策:スワップが常時使われる状態になったらインスタンスタイプのアップサイズを検討する

スワップの監視と容量超過対処

1. 現状の確認コマンド

# スワップ使用量を確認(最も手早い方法) free -h # total used free shared buff/cache available # Mem: 7.6Gi 6.8Gi 102Mi 38Mi 712Mi 612Mi # Swap: 4.0Gi 3.1Gi 947Mi # スワップの詳細(どのswapfileが使われているか) swapon --show # NAME TYPE SIZE USED PRIO # /swapfile file 4096M 3100M -2 # スワップの使用状況をリアルタイムで監視 watch -n 2 "free -h; echo ''; swapon --show"

2. どのプロセスがスワップを消費しているかを特定する

# プロセス別スワップ使用量を確認(降順ソート) for pid in /proc/[0-9]*/status; do awk -v PID=$(echo $pid | cut -d'/' -f3) \ '/VmSwap/{printf "PID=%s Swap=%s %s\n", PID, $2, $3}' $pid done | sort -t= -k3 -rn | head -10

3. スワップ容量超過の対処手順


一時的なメモリスパイク:待機(スパイクが収まればスワップは自動的に回収される)
恒常的なスワップ使用:プロセス再起動 → 不要サービスの停止 → インスタンスのメモリ増設
swapfileの緊急拡張:既存のswapfileを一度無効化し、より大きなファイルで置き換える

# swapfileを拡張する手順(4GB → 8GBへ) sudo swapoff /swapfile sudo dd if=/dev/zero of=/swapfile bs=1M count=8192 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile swapon --show # NAME TYPE SIZE USED PRIO # /swapfile file 8GiB 0B -2

よくあるエラーとトラブルシュート

「swapon: /swapfile: read swap header failed」が出た場合

mkswap を実行せずに swapon しようとしたときのエラーです。

swapon: /swapfile: read swap header failed

対処:必ず sudo mkswap /swapfile を実行してから sudo swapon /swapfile を実行してください。

「swapon: /swapfile: insecure permissions 0644, 0640 suggested」が出た場合

swapon: /swapfile: insecure permissions 0644, 0640 suggested.

swapfileのパーミッションが600になっていない状態です。

sudo chmod 600 /swapfile sudo swapon /swapfile

btrfsで「swapon failed: Invalid argument」が出た場合

btrfsではCOW(Copy-On-Write)属性が付いたファイルをswapfileに使用できません。

# btrfsでの対処:COW属性を無効化してddで作成 sudo truncate -s 0 /swapfile sudo chattr +C /swapfile sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

本記事のまとめ

Linuxサーバーのスワップ設計と設定方法を解説しました。

やりたいこと コマンド
スワップ使用状況を確認 free -h
スワップの詳細一覧を表示 swapon --show
swapfileを作成(4GB) sudo dd if=/dev/zero of=/swapfile bs=1M count=4096
swapfileを初期化 sudo mkswap /swapfile
スワップを有効化 sudo swapon /swapfile
スワップを無効化 sudo swapoff /swapfile
fstab全スワップを有効化 sudo swapon -a
swappiness を一時変更 sudo sysctl vm.swappiness=10
swappiness を永続化 echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.d/99-swappiness.conf

スワップはOOM Killerから守る緩衝材ですが、常にスワップが消費されている状態はサーバーのパフォーマンス劣化のサインです。定期的な監視と、必要に応じた物理メモリの増設を検討してください。

スワップ設定の次は、本番で通用するLinuxサーバー設計を体系的に学びませんか?

メモリ・スワップ・ディスク設計は、場当たり的に覚えると本番で痛い目を見ます。現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。