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

Elastic Compute Service:OOM ドリル

最終更新日:Apr 22, 2025

インジェクションプロセスを使用してメモリを継続的に消費することにより、Elastic Compute Service (ECS) インスタンスでメモリ不足 (OOM) ドリルを実行できます。これにより、ビジネスプロセスが期待どおりに終了するかどうかをテストし、システムの回復機能を検査し、監視およびアラートメカニズムの有効性を検証できます。その後、ドリル結果に基づいて対応戦略を開発できます。これにより、本番環境で OOM が発生した場合にシステムが通常の動作を迅速に再開できるようになり、ビジネスの中断のリスクを軽減できます。

OOM と OOM Killer とは何ですか?

OOM とは、オペレーティングシステムで使用可能なメモリがプロセスのメモリ需要を満たすのに不十分なシナリオを指し、プロセスまたはシステムの不安定化につながる可能性があります。この問題を解決するために、Linux は OOM Killer カーネルメカニズムを使用してプロセスにスコア (oom_score) を付け、優先度の低いメモリ使用量の多いプロセスを優先的に終了してメモリを解放します。これにより、システムメモリの枯渇によって引き起こされる可能性のある制御不能なビジネスおよびシステムのクラッシュを防ぎます。

実装

このドリルでは、ACS-ECS-HighMemory クラウドアシスタントプラグインを使用します。このプラグインは、障害の注入前に割り当てる必要のあるメモリを計算し、trigger_oom インジェクションプロセスを開始して、ターゲットのメモリ使用量に達するまで特定のレートでメモリを消費します。 OOM が発生すると、オペレーティングシステムはプロセスのスコアに基づいて終了するプロセスを選択します。プロセスのスコアは、プロセスが占有するメモリサイズと、プロセスの oom_score_adj パラメーターから計算されます。障害の注入中に、インジェクションプロセスの oom_score_adj パラメーターを調整して、OOM が発生したときにオペレーティングシステムがビジネスプロセスまたはインジェクションプロセスを終了するように選択できます。 oom_score_adj パラメーターの範囲は -1000 ~ 1000 で、デフォルト値は 0 です。値が高いほど、プロセスが終了する可能性が高くなります。値 -1000 は、OOM Killer がプロセスを終了することを禁止していることを示します。

手順

前提条件

障害を注入する

  1. sudo 権限を持つユーザーとして ECS インスタンスに接続します。

    詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。

  2. ACS-ECS-HighMemory クラウドアシスタントプラグインを実行します。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,[score=paramA],[percent=paramB],[rate=paramC],[duration=paramD]

    オプションの障害注入パラメーターは、角かっこ ([]) で囲みます。

    • score: インジェクションプロセスの oom_score_adj パラメーターを -1000 ~ 1000 の範囲の値に設定します。このパラメーターは、OOM が発生したときにインジェクションプロセスまたはビジネスプロセスを終了するかどうかを決定します。ビジネスプロセスを終了するには、-100 などの負の値をインジェクションプロセスに設定します。ビジネスプロセスが終了しない場合は、スコア値を小さくします。

    • percent: ターゲットのメモリ使用量。このパラメーターを指定しない場合、OOM は常にトリガーされます。

    • rate: メモリ消費率。単位: MB/秒。デフォルト値: 0 (制限なし)。

    • duration: ターゲットのメモリ使用量に達するまでの時間。単位: 秒。期間が終了すると、メモリは自動的に解放されます。デフォルト値: 300。

  3. 障害が注入されたかどうかを確認します。

    • OOM が発生しないシナリオ:

      • top コマンドを実行します。システムのメモリ使用量がターゲットの使用量に達すると、障害が注入されます。

      • [監視] タブで ECS コンソールのインスタンス詳細ページまたは CloudMonitor コンソールで、メモリ使用量がターゲットの使用量に達すると、障害が注入されます。

        image

    • OOM が発生するシナリオ: システムログで Out of memory に関連するログを検索します。

      dmesg -T | grep "Out of memory" 

      次のエラーメッセージは、ECS インスタンスで OOM が発生したことを示しており、障害が注入されたことを示しています。終了したプロセスがターゲットプロセスであるかどうかを確認します。ターゲットプロセスが終了しない場合は、score パラメーターを調整します。

      image

障害から回復する

ターゲットのメモリ使用量を指定した場合は、次の方法を使用して注入された障害を削除します。

  • 方法 1 (推奨): ECS インスタンスで次の障害回復コマンドを実行し、メモリ使用量が障害注入前のレベルに低下するかどうかを確認します。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params recover
  • 方法 2: 障害がタイムアウトした後、メモリが自動的に解放されるのを待ちます。デフォルトでは、ターゲットのメモリ使用量に達してから 300 秒後にシステムは自動的にメモリを解放します。

ターゲットのメモリ使用量を指定しなかった場合、OOM は常にトリガーされます。ほとんどの場合、システムは自動的に回復できます。予期しないプロセスが誤って終了しないように、ECS インスタンスを再起動することをお勧めします。

ドリルケース

  1. 120 秒間、20 MB/秒のレートでメモリの 90% を占有することが想定される障害を注入します。

    sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,rate=20,duration=120

    次のコマンド出力は、障害が注入されたことを示しています。

    image

  2. 注入結果を確認します。

    top コマンドを実行する

    1. top コマンドを実行し、M キーを押してコマンド出力をメモリ使用量でソートし、m キーを押してメモリ使用量バーを表示します。

      次のコマンド出力は、現在のメモリ使用量が 90.2% であり、trigger_oom インジェクションプロセスがメモリの 84.4% を占有していることを示しています。

      image

    2. 障害がタイムアウトした後、システムは自動的にメモリを解放します。メモリ使用量は障害注入前のレベルに減少し、インジェクションプロセスは終了します。

      image

    ECS コンソールのインスタンス詳細ページの [監視] タブに移動する

    image

    ECS コンソールのインスタンス詳細ページの [監視] タブで、メモリ使用量チャートを確認します。システムのメモリ使用量は、障害が注入された後、指定されたレートで増加し、ターゲットのメモリ使用量である 90% に達し、120 秒後に注入前のレベルに低下します。

一般的な OOM の原因と解決策

  • メモリ使用量が多いと、システムの動作が遅くなったり、内部サービスの応答が遅くなったりする可能性があります。メモリ使用量が多い原因のトラブルシューティングと分析を行い、問題を解決できます。詳細については、「Linux インスタンスのメモリ使用量が多い場合の対処方法」をご参照ください。

  • OOM は、ECS インスタンスの使用可能なメモリが少なすぎるか、リソースが頻繁にリクエストされ、システムリソースが枯渇するために発生する可能性があります。 OOM の原因を分析し、問題を解決できます。詳細については、「Linux インスタンスでの OOM エラーの処理方法」をご参照ください。