Alibaba Cloud Elastic Compute Service (ECS) インスタンスの物理メモリが不足した場合、スワップ領域の設定はコスト効率の良い緊急時の解決策です。ディスク領域を仮想メモリとして使用することで、物理メモリが枯渇した際のメモリ不足 (OOM) エラーを防ぎ、システムの稼働を維持します。
-
ECS インスタンスのメモリが不足している場合は、まず インスタンスタイプを変更 して物理メモリを増やすことを推奨します。
-
基本ディスクは I/O パフォーマンスが低く、システムボトルネックの原因となる可能性があるため、基本ディスク上でのスワップパーティションの使用は推奨しません。他の種類のクラウドディスクについては、ニーズに応じてスワップパーティションを使用できます。ただし、頻繁なスワッピングを避け、システムの安定性を維持するために、適切に設定する必要があります。
方法1:クラウドアシスタントプラグインの使用 (推奨)
スワップパーティションを自動的に設定するには、クラウドアシスタントエージェントをインストールする必要があります。インスタンスがクラウドアシスタントをサポートしていない場合、またはエージェントをインストールできない場合は、方法2 を使用して手動でスワップを設定してください。
スワップパーティションの有効化
ECS インスタンスにログインします。
[ECS コンソール - インスタンス] に移動します。上部メニューで、目的のリージョンとリソースグループを選択します。
対象インスタンスの詳細ページに移動します。 [Connect] をクリックし、[Workbench] を選択します。 ページ上のプロンプトに従ってターミナルにログインします。
-
次のコマンドを実行して、スワップパーティションを有効化します。
acs-plugin-manager --exec --plugin ACS-ECS-SwapConfig --params --enable次の出力は、スワップパーティションが正常に有効化されたことを示します。
[INFO] The system support auto config swap partition. [INFO] Alibaba Cloud Swap Configuration Document:https://www.alibabacloud.com/help/ecs/support/how-do-i-configure-the-swap-partition-of-a-linux-instance [INFO] Turn On Swap...... [INFO] RAM size: 8 G [INFO] Swap size: 8 G [INFO] Check disk available size...... [INFO] Disk available size: 33 G [INFO] Disk available size enough [INFO] Recover swap configuration from /etc/fstab [INFO] Config vm.swappiness=20 to /etc/sysctl.conf [SUCCESS] Swap has been turned on.説明このプラグインは、以下のルールに従ってシステムメモリに基づいてスワップパーティションのサイズを自動的に設定します。
-
RAM ≤ 2 GB の場合、スワップサイズ = RAM × 2。
-
2 GB < RAM ≤ 8 GB の場合、スワップサイズ = RAM。
-
RAM > 8 GB の場合、スワップパーティションは推奨されません。
-
利用可能なディスク領域が 5 GB 未満の場合、スワップパーティションは推奨されません。
vm.swappinessパラメータのデフォルト値は 20 です。スワップパーティションのサイズをカスタマイズするには、「方法2:スワップパーティションの手動設定」を参照してください。 -
スワップパーティションのステータスの確認
次のコマンドを実行して、スワップパーティションのステータスを確認します。
acs-plugin-manager --exec --plugin ACS-ECS-SwapConfig --params --status
次の出力は、スワップパーティションが有効になっていることを示します。
[INFO] The system support auto config swap partition.
[INFO] Alibaba Cloud Swap Configuration Document:https://www.alibabacloud.com/help/ecs/support/how-do-i-configure-the-swap-partition-of-a-linux-instance
[INFO] ========== Swap status ==========
NAME TYPE SIZE USED PRIO
/swapfile file 8G 0B -2
[INFO] Swap is enabled
スワップパーティションの無効化
次のコマンドを実行して、スワップパーティションを無効化します。
acs-plugin-manager --exec --plugin ACS-ECS-SwapConfig --params --disable
次の出力は、スワップパーティションが正常に無効化されたことを示します。
[INFO] The system support auto config swap partition.
[INFO] Alibaba Cloud Swap Configuration Document:https://www.alibabacloud.com/help/ecs/support/how-do-i-configure-the-swap-partition-of-a-linux-instance
[INFO] Turn Off Swap......
[INFO] Cancel swap configuration from /etc/fstab
[INFO] Config vm.swappiness=0 to /etc/sysctl.conf
[INFO] Deleted swapfile: /swapfile
[SUCCESS] Swap has been turned off.
方法2:手動設定
スワップパーティションの有効化
手順1:現在のスワップステータスの確認
開始する前に、競合を避けるため、システムに既存のスワップ設定がないことを確認してください。
ECS インスタンスにログインします。
[ECS コンソール - インスタンス] に移動します。上部メニューで、目的のリージョンとリソースグループを選択します。
対象インスタンスの詳細ページに移動します。 [Connect] をクリックし、[Workbench] を選択します。 ページ上のプロンプトに従ってターミナルにログインします。
-
スワップパーティションの設定を確認します。
swapon --show-
コマンドが出力を返さない場合、スワップは設定されていないため、次の手順に進むことができます。
-
次のような出力が返された場合、アクティブなスワップ領域がすでに存在します。 スワップファイルを無効化してクリーンアップするか、別のディスクに新しいスワップファイルを作成することができます。

-
手順2:スワップファイルの作成と設定
-
スワップファイルを作成します。
この例では、1 GiB の
/swapfileを作成する方法を示します。fallocateコマンドの使用を推奨します。このコマンドは即時にファイル領域を割り当てることができ、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はカスタマイズ可能な変数であり、スワップパーティションの識別子を表し、既存のパーティション識別子と同じにすることはできません。 -
bsとcountの値はスワップファイルのサイズを決定し、カスタマイズできます。たとえば、bs=1M count=1024はスワップファイルのサイズを 1 GB に設定します。
-
-
安全なパーミッションを設定します。
root 以外のユーザーが、パスワードやキーなどの機密データを含む可能性のあるスワップファイルを読み取れないように、そのパーミッションを
600に設定します。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. /etc/fstabファイルに基づいてすべてのスワップパーティションを再マウント sudo swapon -a # 3. スワップが期待どおりに再マウントされたかを確認 swapon --showコマンドがスワップ情報を正しく出力した場合、永続化の設定は成功です。
swappiness の調整
swappiness は、システムがどの程度積極的にスワップを使用するかを制御する Linux カーネルパラメータです。値の範囲は 0 から 100 です。
-
高い値:カーネルはより積極的にスワップを使用し、非アクティブなメモリページをより早期にディスクに移動します。
-
低い値:カーネルはスワップの使用を避け、ページを物理メモリに保持することを優先し、物理メモリが危機的に低い場合にのみスワップを使用します。
スワップパラメータの調整には注意が必要です。不適切な変更は、システムのパフォーマンスを低下させたり、予期しない仮想メモリの動作を引き起こす可能性があります。特定のワークロードで必要であり、かつパラメータの機能を完全に理解している場合にのみ変更を行ってください。不明な場合は、デフォルト設定を維持してください。
シナリオ別の推奨事項:
|
適用シナリオ |
推奨 |
理由 |
|
データベース (MySQL, PostgreSQL) |
1~10 |
クエリのパフォーマンスを確保するため、コアとなるバッファプールがスワップアウトされるのを避けます。 |
|
インメモリデータベース (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パラメータの設定が有効になったことを示します。
スワップ使用量の監視
|
監視目的 |
推奨コマンド |
説明 |
|
全体的なメモリとスワップの使用状況の表示 |
|
最も一般的で簡単なコマンドです。 |
|
リアルタイムのスワップアクティビティ (スワップイン/スワップアウト) の監視 |
|
|
|
スワップを使用しているプロセスの特定 |
|
このコマンドは、すべてのプロセスを反復処理し、各プロセスの名前とスワップ使用量をリストアップし、結果をソートしてスワップ使用量が最も高いプロセスを一番上に表示します。 |
|
過去のパフォーマンスの分析 |
|
|
スワップの無効化とクリーンアップ
スワップファイルが不要になった場合は、安全に無効化し、ファイルを削除してディスク領域を解放します。
-
指定されたスワップファイルを無効化します。
sudo swapoff /swapfile -
fstabから自動マウント設定を削除します。sedコマンドを使用して対応する行を安全に削除し、手動編集によるエラーを回避します。sudo sed -i '\|/swapfile|d' /etc/fstab -
スワップファイルを削除してディスク領域を解放します。
sudo rm /swapfile -
スワップが完全に無効化されたことを確認します。
swapon --showまたはfree -hを実行して、スワップ情報が消えていることを確認します。
よくある質問
スワップが期待どおりに動作しないのはなぜですか?
スワップパーティションを作成し、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ルールに従うため、グローバルな設定は無効になります。
クイック検証
-
実行中のプロセスの 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 は v1 の多くの設計上の問題を修正し、統一された階層構造を使用します。v2 モードでは、子 cgroup はデフォルトで親ノードの設定を継承します。グローバルな vm.swappiness を設定するだけで、この設定はシステムのすべてのプロセスに自動的かつ均一に適用されます。
手順:
-
カーネルブートパラメーターの更新:
grubbyツールを使用して、すべてのカーネルにsystemd.unified_cgroup_hierarchy=1パラメーターを追加して cgroup v2 を有効にします。sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"注意:このコマンドによる変更は永続的です。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 設定を使用して問題を解決できます。
原則: この方法は、障害が発生する可能性のあるグローバル設定に依存するのではなく、コア slice を作成するときに、指定された swappiness 値を使用するように systemd に直接指示します。
手順:
-
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 -
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 -
設定を適用します。
sudo systemctl daemon-reload sudo rebootdaemon-reloadはsystemdの設定のみをリロードします。すべてのサービスとセッションが新しい Slice 設定で作成されるようにするには、サーバーを再起動する必要があります。