すべてのプロダクト
Search
ドキュメントセンター

:Linux インスタンスのスワップ領域の設定方法

最終更新日:Dec 24, 2025

Elastic Compute Service (ECS) インスタンスの物理メモリが少なくなった場合、スワップ領域の設定は、ディスク領域を仮想メモリとして使用する、コスト効率の高い緊急ソリューションです。これにより、一時的なメモリの急増時にメモリ不足 (OOM) エラーによるシステムのクラッシュを防ぎ、物理メモリが枯渇した場合でもシステムの動作を継続させることができます。

重要
  • スワップ領域を有効にすると、メモリの I/O パフォーマンスが低下する可能性があります。ご利用の ECS インスタンスで頻繁にメモリ不足が発生する場合、根本的な解決策はインスタンスタイプを変更して物理メモリを増やすことです。

  • 基本ディスクではスワップ領域を使用しないでください。I/O パフォーマンスが低いため、パフォーマンスの低下や I/O ボトルネックを引き起こす可能性があります。他のディスクタイプでは、必要に応じてスワップ領域を使用できます。ただし、頻繁なスワッピングを避けるために適切に設定する必要があります。頻繁なスワッピングは、システムのパフォーマンスと安定性に悪影響を与える可能性があります。

操作手順

ステップ 1:現在のスワップステータスの確認

開始する前に、競合を避けるため、システムに既存のスワップ設定がないことを確認します。

  1. ECS インスタンスにログインします。

    1. ECS コンソール - [インスタンス] に移動します。上部のナビゲーションバーで、対象のリージョンとリソースグループを選択します。

    2. 対象インスタンスの詳細ページに移動します。[接続] をクリックし、[ワークベンチ] を選択します。画面の指示に従ってターミナルにログインします。

  2. スワップ領域の設定を確認します。

    swapon --show
    • 出力が空の場合、システムにスワップ領域は設定されていません。次のステップに進むことができます。

    • 以下のような出力が返された場合、システムにはすでにスワップ領域があります。必要に応じてスワップ領域を無効にするか、別のディスクに新しいスワップファイルを作成することができます。

      image

ステップ 2:スワップファイルの作成と設定

  1. スワップファイルを作成します。

    この例では、fallocate コマンドを使用して、/swapfile という名前の 1 GiB のスワップファイルを作成します。このコマンドはファイルスペースを即座に割り当てるため、dd よりも効率的です。

    # 1 GiB のスワップファイルを作成
    sudo fallocate -l 1G /swapfile
    XFS の初期バージョンなど、ファイルシステムが fallocate をサポートしていない場合、システムは fallocate failed: Operation not supported というメッセージを返します。この場合は、代わりに dd コマンドを使用してください。このコマンドは実行に時間がかかります。
    sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
    • of の値である /swapfile は、スワップファイルのパスと名前を表す変数です。この値はカスタマイズできますが、既存のファイル名やパーティション名と同じにすることはできません。

    • bscount の値によって、スワップファイルのサイズが決まります。これらの値はカスタマイズできます。このコマンドでは、bs=1M count=1024 によってスワップファイルのサイズが 1 GB に設定されます。

  2. 安全な権限を設定します。

    スワップファイルの権限を 600 に設定します。これにより、root 以外のユーザーがスワップファイルを読み取ることを防ぎます。スワップファイルには、メモリからスワップアウトされたパスワードやキーなどの機密データが含まれている可能性があります。

    sudo chmod 600 /swapfile
  3. ファイルをスワップエリアとしてフォーマットします。この操作により、ファイルがスワップスペースとして使用できるようにマークされます。

    sudo mkswap /swapfile

    成功した場合の応答は、以下のようになります。

    Setting up swapspace version 1, size = 1 GiB (1073737728 bytes)
    no label, UUID=a1a7e24c-38f6-41a4-9e18-be60b631133a
    : スワップファイルは 40 KB を超える必要があります。そうでない場合、mkswap コマンドはエラーを返します。

ステップ 3:スワップの有効化と検証

スワップファイルを有効化し、システムがそれを認識していることを確認します。

  1. スワップファイルを有効化します。

    sudo swapon /swapfile
  2. スワップファイルが有効になっていることを確認します。

    swapon --show

    正常に有効化されると、次のように表示されます:

    NAME       TYPE SIZE USED PRIO
    /swapfile  file   1G   0B   -2

    または、free -h コマンドを実行してスワップのステータスを確認することもできます。出力の Swap 行に合計スワップ領域が表示されます。

ステップ 4:起動時の自動マウント設定 (永続化)

インスタンスの再起動後もスワップファイルがアクティブな状態を維持するように、スワップ設定を /etc/fstab ファイルに追加します。

  1. (推奨) 誤った操作による問題を防ぐため、fstab ファイルをバックアップします。

    sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)
  2. スワップ設定を fstab ファイルに追記します。

    次のコマンドは、同じ設定を二重に追加しないように、まず重複エントリをチェックします。
    SWAP_FILE_PATH="/swapfile"
    if ! grep -q "swap" /etc/fstab; then
        echo "${SWAP_FILE_PATH} none swap sw 0 0" | sudo tee -a /etc/fstab
    else
        echo "Swap entry already exists in /etc/fstab. No changes made."
    fi
  3. 永続化設定を検証します。

    インスタンスを再起動せずに、/etc/fstab の構成が正しいことを確認できます。

    # 1. すべてのスワップを無効化します。
    sudo swapoff -a
    # 2. fstab の内容に基づいてすべてのスワップを再マウントします。
    sudo swapon -a
    # 3. スワップが期待どおりに再マウントされたか確認します。
    swapon --show

    コマンドがスワップ情報を正しく出力した場合、永続的な構成は成功です。

最適化と管理

スワップ使用傾向 (swappiness) の調整

swappiness は、システムがどれだけ積極的にスワップ領域を使用するかを制御する Linux カーネルパラメーターです。値の範囲は 0 から 100 です。

  • 高い値:カーネルはスワップ領域をより積極的に使用し、非アクティブなメモリページをより早くディスクにスワップアウトします。

  • 低い値:カーネルはスワップ領域の使用を控えます。メモリページを物理メモリに保持することを優先し、物理メモリが極めて少なくなった場合にのみスワップ領域を使用します。

重要

swappiness パラメーターの調整は注意を要する操作です。不適切な変更は、システムのパフォーマンス低下や予期せぬ仮想メモリの使用につながる可能性があります。この操作は、ビジネスシナリオで必要な場合、かつパラメーターの機能を十分に理解している場合にのみ実行してください。調整が必要かどうかわからない場合は、デフォルト設定を維持することを推奨します。

シナリオ別の推奨事項:

アプリケーションシナリオ

推奨 swappiness

技術的根拠

データベース (MySQL, PostgreSQL)

1-10

データベースは I/O レイテンシーに敏感です。クエリのパフォーマンスを確保するため、コアとなるバッファープールがスワップアウトされるのを避けます。

インメモリデータベース (Redis, Memcached)

1

インメモリデータベースはレイテンシーに極めて敏感です。任意のスワップ操作がパフォーマンスに深刻な影響を与える可能性があります。値が 1 の場合、スワップは絶対に必要な場合にのみ使用されます。

Web アプリケーションサーバ (Nginx, Apache)

10-60

応答速度とメモリ使用率のバランスを取ります。コアではない、非アクティブなプロセスのページをスワップアウトできるようにします。

デフォルト/汎用/バッチ処理

60 (システムデフォルト)

ほとんどの汎用シナリオに適しています。非アクティブなシステムプロセスをスワップアウトして、アクティブなタスクのためにより多くの物理メモリを解放できます。

変更方法:

  1. /etc/sysctl.conf ファイルを編集します。この例では、利用可能な物理メモリが合計の 10% 未満になった場合にのみスワップ領域が使用されるようにパラメーター値を調整します。

    vm.swappiness=10
  2. ファイルを保存して終了し、次のコマンドを実行して設定を適用します。

    sudo sysctl -p
  3. 次のコマンドを実行して、swappiness パラメーターの設定が有効であることを確認します。

    cat /proc/sys/vm/swappiness

    次のような出力は、swappiness パラメーターの設定が有効であることを示します。

    image

スワップ使用状況の監視

監視目的

推奨コマンド

説明

全体的なメモリとスワップの使用状況の表示

free -h

最も一般的で簡単なコマンドです。

リアルタイムのスワップアクティビティ (スワップイン/スワップアウト) の監視

vmstat 1

si (スワップイン) と so (スワップアウト) の列に注目します。これらの列に常にゼロ以外の値が表示される場合、システムは頻繁にスワッピングを行っています。これはパフォーマンスの問題を示している可能性があります。

スワップを使用しているプロセスの検索

`for file in /proc/*/status; do awk '/VmSwap

Name/{printf 2""2""3}END{ print ""}' $file; done | grep -v "0 kB" | sort -k 2 -n -r

過去のパフォーマンス分析

atop

atop は、過去のリソース使用量を記録できる強力なパフォーマンス監視ツールです。システムが遅延している場合、atop ログを使用して、問題が発生した時点のプロセスとリソースの状態を追跡できます。

スワップの無効化とクリーンアップ

スワップファイルが不要になった場合、安全に無効化してファイルを削除し、ディスク領域を解放できます。

  1. 指定されたスワップファイルを無効化します。

    sudo swapoff /swapfile
  2. /etc/fstab から自動マウント設定を削除します。sed コマンドを使用して対応する行を安全に削除し、手動編集によるエラーを回避できます。

    sudo sed -i '\|/swapfile|d' /etc/fstab
  3. スワップファイルを削除してディスク領域を解放します。sudo rm /swapfile

    sudo rm /swapfile
  4. スワップファイルが完全に無効化されたことを確認します。

    swapon --show または free -h コマンドを実行し、スワップ情報が表示されなくなったことを確認します。

スワップ領域の無効化

  1. 次のコマンドを実行して、スワップ領域を無効化します。

    sudo swapoff /swapfile
    説明

    /swapfile パラメーターは、スワップ領域の識別子を指定します。ご利用の環境の実際の識別子に置き換えてください。

  2. /etc/fstab ファイルを編集し、自動マウントを無効にするために、次のようなスワップマウント情報を削除します。

    /swapfile none swap defaults 0 0
  3. ファイルを保存して閉じます。次に、次のコマンドを実行して、スワップ領域が無効になっているかどうかを確認します。

    swapon --show

    コマンド出力が空の場合、スワップ領域は無効になっています。

    image

よくある質問

スワップが期待どおりに動作しない場合の対処法

スワップ領域を作成し、swappiness パラメーターを調整した後でも、物理メモリに大きな負荷がかかっているにもかかわらず、スワップ領域の使用率が低いままであることがあります。これにより、swappiness の設定が効果を発揮していないように見えることがあります。

問題の診断

この問題の根本原因は、最新の Linux ディストリビューションで使用されている systemdコントロールグループ (Cgroup) のメカニズムに関連しています。

  1. ローカル Cgroup ルール:デフォルトの Cgroup v1 モードでは、systemd はシステムサービス (system.slice)、ユーザーセッション (user.slice)、およびその他のコンポーネントに対して個別の Cgroup を作成します。各 Cgroup は、memory.swappiness を含む独自のリソース制御パラメーターを持つことができます。

  2. ローカル設定がグローバル設定を上書きする:systemd がこれらの Cgroup を初期化する際、デフォルトの memory.swappiness 値 (通常は 60) を割り当てます。この Cgroup 固有の設定は、/etc/sysctl.conf で設定したグローバルな vm.swappiness 設定よりも優先度が高くなります。

  3. 結果:実行中のプログラムは、グローバルルールではなく、所属する Cgroup の swappiness ルールに従います。これにより、グローバル設定は無効になります。

簡単な検証
  1. 実行中のプロセスのプロセス ID (PID) を見つけます。たとえば、pidof nginx コマンドを実行します。

  2. プロセスが属する Cgroup を確認します:

    cat /proc/[PID]/cgroup

    出力には /system.slice/nginx.service のようなパスが表示されます。

  3. この Cgroup の実際の swappiness 値を確認します:

    cat /sys/fs/cgroup/memory/system.slice/nginx.service/memory.swappiness

    グローバルな vm.swappiness パラメーターを別の値に設定していても、出力はほとんどの場合 60 になります。これは、グローバル設定が適用されていないことを確認するものです。

ソリューション

ソリューション 1:Cgroup v2 への切り替え (推奨)

原則:Cgroup v2 は Cgroup v1 の多くの設計上の問題を修正し、統一された階層を使用します。Cgroup v2 モードでは、子 Cgroup はデフォルトで親ノードの設定を継承します。グローバルな vm.swappiness パラメーターを設定するだけで、その設定がシステム内のすべてのプロセスに自動的に適用されます。

手順

  1. カーネルの起動パラメーターを更新します。
    grubby ツールを使用して、すべてのカーネルに systemd.unified_cgroup_hierarchy=1 パラメーターを追加し、Cgroup v2 を有効にします。

    sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
    注:このコマンドは永続的です。GRand Unified Bootloader (GRUB) の設定を変更し、次回の起動時にシステムが Cgroup v2 モードで初期化されるようにします。
  2. ECS インスタンスを再起動します。
    これはカーネルレベルのパラメーターであり、有効にするには再起動が必要です。

    sudo reboot
  3. 検証と設定:

    • 検証:インスタンスの再起動後、mount | grep cgroup コマンドを実行します。タイプが cgroup2 のマウントポイントが表示されれば、Cgroup v2 への切り替えは成功です。

    • 設定:/etc/sysctl.conf ファイルで、目的の vm.swappiness 値を設定し、sudo sysctl -p コマンドを実行してシステム全体に設定を適用します。

ソリューション 2:Cgroup v1 環境での永続的な設定 (代替案)

Cgroup v2 と互換性のない古いコンテナーソフトウェアを実行している場合など、環境を切り替えられない場合は、systemd のオーバーライド設定 (drop-in) を使用して問題を解決できます。

原則:効果がない可能性のあるグローバル設定に依存する代わりに、このソリューションでは、systemd がコアとなる slices を作成する際に、指定された swappiness 値を使用するように設定します。

手順:

  1. system.slice (すべてのシステムサービスに影響) のオーバーライド設定を作成します:

    60 を目的の swappiness 値に置き換えます。

    sudo mkdir -p /etc/systemd/system/system.slice.d/
    sudo tee /etc/systemd/system/system.slice.d/99-swappiness.conf <<'EOF'
    [Slice]
    MemorySwappiness=60
    EOF
  2. user.slice (すべてのユーザーログインセッションに影響) のオーバーライド設定を作成します。

    60 を目的の swappiness 値に置き換えます。

    sudo mkdir -p /etc/systemd/system/user.slice.d/
    sudo tee /etc/systemd/system/user.slice.d/99-swappiness.conf <<'EOF'
    [Slice]
    MemorySwappiness=60
    EOF
  3. 設定を適用するために再起動します。

    sudo systemctl daemon-reload
    sudo reboot
    daemon-reloadsystemd の設定を再読み込みするだけです。すべてのサービスとセッションが新しいスライス設定の下で作成されるようにするには、サーバーを再起動する必要があります。