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 でスワップの使用状況をリアルタイムに確認できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
スワップ領域とは何か: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:"
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
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.
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:~/.ssh/configの書き方完全ガイド|Host設定・ProxyJump・IdentityFileで接続を効率化する
- 前のページへ:sshd_configの設定ガイド|Port変更・rootログイン禁止・鍵認証設定の手順
- この記事の属するカテゴリ:Linuxtips・ディスク操作へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます