Elastic Compute Service (ECS) インスタンスの物理メモリが少なくなった場合、スワップ領域の設定は、ディスク領域を仮想メモリとして使用する、コスト効率の高い緊急ソリューションです。これにより、一時的なメモリの急増時にメモリ不足 (OOM) エラーによるシステムのクラッシュを防ぎ、物理メモリが枯渇した場合でもシステムの動作を継続させることができます。
スワップ領域を有効にすると、メモリの I/O パフォーマンスが低下する可能性があります。ご利用の ECS インスタンスで頻繁にメモリ不足が発生する場合、根本的な解決策はインスタンスタイプを変更して物理メモリを増やすことです。
基本ディスクではスワップ領域を使用しないでください。I/O パフォーマンスが低いため、パフォーマンスの低下や I/O ボトルネックを引き起こす可能性があります。他のディスクタイプでは、必要に応じてスワップ領域を使用できます。ただし、頻繁なスワッピングを避けるために適切に設定する必要があります。頻繁なスワッピングは、システムのパフォーマンスと安定性に悪影響を与える可能性があります。
操作手順
ステップ 1:現在のスワップステータスの確認
開始する前に、競合を避けるため、システムに既存のスワップ設定がないことを確認します。
ECS インスタンスにログインします。
ECS コンソール - [インスタンス] に移動します。上部のナビゲーションバーで、対象のリージョンとリソースグループを選択します。
対象インスタンスの詳細ページに移動します。[接続] をクリックし、[ワークベンチ] を選択します。画面の指示に従ってターミナルにログインします。
スワップ領域の設定を確認します。
swapon --show出力が空の場合、システムにスワップ領域は設定されていません。次のステップに進むことができます。
以下のような出力が返された場合、システムにはすでにスワップ領域があります。必要に応じてスワップ領域を無効にするか、別のディスクに新しいスワップファイルを作成することができます。

ステップ 2:スワップファイルの作成と設定
スワップファイルを作成します。
この例では、
fallocateコマンドを使用して、/swapfileという名前の 1 GiB のスワップファイルを作成します。このコマンドはファイルスペースを即座に割り当てるため、ddよりも効率的です。# 1 GiB のスワップファイルを作成 sudo fallocate -l 1G /swapfileXFS の初期バージョンなど、ファイルシステムが
fallocateをサポートしていない場合、システムはfallocate failed: Operation not supportedというメッセージを返します。この場合は、代わりにddコマンドを使用してください。このコマンドは実行に時間がかかります。sudo dd if=/dev/zero of=/swapfile bs=1M count=1024ofの値である/swapfileは、スワップファイルのパスと名前を表す変数です。この値はカスタマイズできますが、既存のファイル名やパーティション名と同じにすることはできません。bsとcountの値によって、スワップファイルのサイズが決まります。これらの値はカスタマイズできます。このコマンドでは、bs=1M count=1024によってスワップファイルのサイズが 1 GB に設定されます。
安全な権限を設定します。
スワップファイルの権限を
600に設定します。これにより、root 以外のユーザーがスワップファイルを読み取ることを防ぎます。スワップファイルには、メモリからスワップアウトされたパスワードやキーなどの機密データが含まれている可能性があります。sudo chmod 600 /swapfileファイルをスワップエリアとしてフォーマットします。この操作により、ファイルがスワップスペースとして使用できるようにマークされます。
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:スワップの有効化と検証
スワップファイルを有効化し、システムがそれを認識していることを確認します。
スワップファイルを有効化します。
sudo swapon /swapfileスワップファイルが有効になっていることを確認します。
swapon --show正常に有効化されると、次のように表示されます:
NAME TYPE SIZE USED PRIO /swapfile file 1G 0B -2または、
free -hコマンドを実行してスワップのステータスを確認することもできます。出力のSwap行に合計スワップ領域が表示されます。
ステップ 4:起動時の自動マウント設定 (永続化)
インスタンスの再起動後もスワップファイルがアクティブな状態を維持するように、スワップ設定を /etc/fstab ファイルに追加します。
(推奨) 誤った操作による問題を防ぐため、
fstabファイルをバックアップします。sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)スワップ設定を
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永続化設定を検証します。
インスタンスを再起動せずに、
/etc/fstabの構成が正しいことを確認できます。# 1. すべてのスワップを無効化します。 sudo swapoff -a # 2. fstab の内容に基づいてすべてのスワップを再マウントします。 sudo swapon -a # 3. スワップが期待どおりに再マウントされたか確認します。 swapon --showコマンドがスワップ情報を正しく出力した場合、永続的な構成は成功です。
最適化と管理
スワップ使用傾向 (swappiness) の調整
swappiness は、システムがどれだけ積極的にスワップ領域を使用するかを制御する Linux カーネルパラメーターです。値の範囲は 0 から 100 です。
高い値:カーネルはスワップ領域をより積極的に使用し、非アクティブなメモリページをより早くディスクにスワップアウトします。
低い値:カーネルはスワップ領域の使用を控えます。メモリページを物理メモリに保持することを優先し、物理メモリが極めて少なくなった場合にのみスワップ領域を使用します。
swappiness パラメーターの調整は注意を要する操作です。不適切な変更は、システムのパフォーマンス低下や予期せぬ仮想メモリの使用につながる可能性があります。この操作は、ビジネスシナリオで必要な場合、かつパラメーターの機能を十分に理解している場合にのみ実行してください。調整が必要かどうかわからない場合は、デフォルト設定を維持することを推奨します。
シナリオ別の推奨事項:
アプリケーションシナリオ | 推奨 | 技術的根拠 |
データベース (MySQL, PostgreSQL) | 1-10 | データベースは I/O レイテンシーに敏感です。クエリのパフォーマンスを確保するため、コアとなるバッファープールがスワップアウトされるのを避けます。 |
インメモリデータベース (Redis, Memcached) | 1 | インメモリデータベースはレイテンシーに極めて敏感です。任意のスワップ操作がパフォーマンスに深刻な影響を与える可能性があります。値が 1 の場合、スワップは絶対に必要な場合にのみ使用されます。 |
Web アプリケーションサーバ (Nginx, Apache) | 10-60 | 応答速度とメモリ使用率のバランスを取ります。コアではない、非アクティブなプロセスのページをスワップアウトできるようにします。 |
デフォルト/汎用/バッチ処理 | 60 (システムデフォルト) | ほとんどの汎用シナリオに適しています。非アクティブなシステムプロセスをスワップアウトして、アクティブなタスクのためにより多くの物理メモリを解放できます。 |
変更方法:
/etc/sysctl.confファイルを編集します。この例では、利用可能な物理メモリが合計の 10% 未満になった場合にのみスワップ領域が使用されるようにパラメーター値を調整します。vm.swappiness=10ファイルを保存して終了し、次のコマンドを実行して設定を適用します。
sudo sysctl -p次のコマンドを実行して、
swappinessパラメーターの設定が有効であることを確認します。cat /proc/sys/vm/swappiness次のような出力は、
swappinessパラメーターの設定が有効であることを示します。
スワップ使用状況の監視
監視目的 | 推奨コマンド | 説明 |
全体的なメモリとスワップの使用状況の表示 |
| 最も一般的で簡単なコマンドです。 |
リアルタイムのスワップアクティビティ (スワップイン/スワップアウト) の監視 |
|
|
スワップを使用しているプロセスの検索 | `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 |
過去のパフォーマンス分析 |
|
|
スワップの無効化とクリーンアップ
スワップファイルが不要になった場合、安全に無効化してファイルを削除し、ディスク領域を解放できます。
指定されたスワップファイルを無効化します。
sudo swapoff /swapfile/etc/fstabから自動マウント設定を削除します。sedコマンドを使用して対応する行を安全に削除し、手動編集によるエラーを回避できます。sudo sed -i '\|/swapfile|d' /etc/fstabスワップファイルを削除してディスク領域を解放します。sudo rm /swapfile
sudo rm /swapfileスワップファイルが完全に無効化されたことを確認します。
swapon --showまたはfree -hコマンドを実行し、スワップ情報が表示されなくなったことを確認します。
スワップ領域の無効化
次のコマンドを実行して、スワップ領域を無効化します。
sudo swapoff /swapfile説明/swapfileパラメーターは、スワップ領域の識別子を指定します。ご利用の環境の実際の識別子に置き換えてください。/etc/fstabファイルを編集し、自動マウントを無効にするために、次のようなスワップマウント情報を削除します。/swapfile none swap defaults 0 0ファイルを保存して閉じます。次に、次のコマンドを実行して、スワップ領域が無効になっているかどうかを確認します。
swapon --showコマンド出力が空の場合、スワップ領域は無効になっています。

よくある質問
スワップが期待どおりに動作しない場合の対処法
スワップ領域を作成し、swappiness パラメーターを調整した後でも、物理メモリに大きな負荷がかかっているにもかかわらず、スワップ領域の使用率が低いままであることがあります。これにより、swappiness の設定が効果を発揮していないように見えることがあります。
問題の診断
この問題の根本原因は、最新の Linux ディストリビューションで使用されている systemd とコントロールグループ (Cgroup) のメカニズムに関連しています。
ローカル Cgroup ルール:デフォルトの Cgroup v1 モードでは、
systemdはシステムサービス (system.slice)、ユーザーセッション (user.slice)、およびその他のコンポーネントに対して個別の Cgroup を作成します。各 Cgroup は、memory.swappinessを含む独自のリソース制御パラメーターを持つことができます。ローカル設定がグローバル設定を上書きする:
systemdがこれらの Cgroup を初期化する際、デフォルトのmemory.swappiness値 (通常は 60) を割り当てます。この Cgroup 固有の設定は、/etc/sysctl.confで設定したグローバルなvm.swappiness設定よりも優先度が高くなります。結果:実行中のプログラムは、グローバルルールではなく、所属する Cgroup の
swappinessルールに従います。これにより、グローバル設定は無効になります。
簡単な検証
実行中のプロセスのプロセス ID (PID) を見つけます。たとえば、
pidof nginxコマンドを実行します。プロセスが属する Cgroup を確認します:
cat /proc/[PID]/cgroup出力には
/system.slice/nginx.serviceのようなパスが表示されます。この 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 パラメーターを設定するだけで、その設定がシステム内のすべてのプロセスに自動的に適用されます。
手順:
カーネルの起動パラメーターを更新します。
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 モードで初期化されるようにします。
ECS インスタンスを再起動します。
これはカーネルレベルのパラメーターであり、有効にするには再起動が必要です。sudo reboot検証と設定:
検証:インスタンスの再起動後、
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 値を使用するように設定します。
手順:
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 EOFuser.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設定を適用するために再起動します。
sudo systemctl daemon-reload sudo rebootdaemon-reloadはsystemdの設定を再読み込みするだけです。すべてのサービスとセッションが新しいスライス設定の下で作成されるようにするには、サーバーを再起動する必要があります。