継続的にメモリを消費するプロセスを注入することで、Elastic Compute Service (ECS) インスタンス上でメモリ不足 (OOM) シナリオをシミュレートします。このドリルは、ビジネスプロセスが終了するかどうかのテスト、システムの回復機能の評価、監視およびアラートメカニズムの有効性の検証に役立ちます。ドリルの結果に基づいて、本番環境で OOM イベントが発生した後にシステムが迅速に通常の運用を再開できるように対応戦略を策定し、ビジネスの中断リスクを低減できます。
仕組み
このソリューションでは、クラウドアシスタントプラグイン ACS-ECS-HighMemory を使用します。障害を注入する前に、プラグインは割り当てるメモリ量を計算します。その後、trigger_oom 注入プロセスを開始します。このプロセスは、ターゲットのメモリ使用率に達するまで、特定のレートでメモリを消費します。OOM イベントが発生すると、オペレーティングシステムはスコアに基づいて終了するプロセスを選択します。プロセスのスコアは、占有するメモリとその oom_score_adj 値に基づいて計算されます。したがって、障害注入中に、注入プロセスの oom_score_adj パラメーターを調整できます。これにより、OOM イベントが発生したときに、オペレーティングシステムがビジネスプロセスまたは注入プロセスのいずれかを終了させることができます。oom_score_adj パラメーターは -1000 から 1000 までの値を受け入れます。デフォルト値は 0 です。値が大きいほど、プロセスは終了されやすくなります。値が -1000 の場合、OOM Killer はプロセスを終了させません。
利用ガイド
前提条件
クラウドアシスタントエージェントが、ドリルを実行する ECS インスタンスにインストールされていること。
ECS インスタンスのクラウドアシスタントのステータスが[正常] であること。詳細については、「クラウドアシスタントのステータスの表示と異常の処理」をご参照ください。
障害注入
ECS インスタンスにログインします。
詳細については、「ワークベンチを使用して Linux インスタンスにログイン」をご参照ください。
sudo 権限を持つユーザーとして、クラウドアシスタントプラグイン
ACS-ECS-HighMemoryを実行します。sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,[score=paramA],[percent=paramB],[rate=paramC],[duration=paramD]コマンドフォーマットの角括弧 [] はオプションパラメーターを示します。コマンド実行時には、角括弧を含めないでください。
たとえば、メモリ使用率を 90% に、期間を 120 秒に設定するには、次のコマンドを実行します:
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,duration=120パラメーター:
score (オプション):注入プロセスの
oom_score_adjを設定します。値の範囲は -1000 から 1000 です。このパラメーターは、メモリ不足 (OOM) イベントが発生したときに、注入プロセスとビジネスプロセスのどちらを終了させるかを決定します。ビジネスプロセスを終了させるには、注入プロセスに負のスコア (例:-100) を設定します。その結果、ビジネスプロセスが終了しない場合は、スコアを下げてください。percent (オプション):ターゲットのメモリ使用率をシステム全体のメモリに対するパーセンテージで指定します。このパラメーターを指定しない場合、デフォルトで OOM イベントがトリガーされます。
rate (オプション):メモリ消費のレートを MB/s 単位で指定します。デフォルト値は 0 で、制限がないことを示します。
duration (オプション):ターゲットのメモリ使用率に達した後、その状態を維持する期間を秒単位で指定します。タイムアウト後、メモリは自動的に解放されます。デフォルト値は 300 秒です。
障害が正常に注入されたことを検証します。
OOM イベントが発生しないシナリオ:
topコマンドを実行します。システムのメモリ使用率がターゲットのパーセンテージに達した場合、障害は正常に注入されています。ECS コンソールのインスタンス監視ページまたは CloudMonitor コンソールで、メモリ使用率がターゲットのパーセンテージに達した場合、障害は正常に注入されています。

OOM イベントが発生するシナリオ:システムログで
Out of memoryを含むログを検索します。dmesg -T | grep "Out of memory"次の出力は、ECS インスタンスで OOM イベントが発生したことを示しており、障害が正常に注入されたことを意味します。終了したプロセスが意図したものであるかを確認してください。そうでない場合は、
scoreパラメーターを調整してください。
障害回復
ターゲットのメモリ使用率を指定した場合、次のいずれかの方法で注入された障害を削除できます。
方法 1 (推奨):ECS インスタンスで障害回復コマンドを実行します。メモリ使用量が障害注入前のレベルまで低下したことを確認します。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params recover方法 2:タイムアウト後に障害が自動的に解放されるのを待ちます。デフォルトでは、ターゲットのメモリ使用率に達してから 300 秒後にシステムが自動的にメモリを解放します。
ターゲットのメモリ使用率を指定しなかった場合、OOM イベントがトリガーされます。システムは通常、自動的に回復します。ただし、他のプロセスが予期せず終了するのを防ぐために、ECS インスタンスを再起動する必要がある場合があります。
ドリル例
メモリ使用率 90%、レート 20 MB/s、期間 120 秒を達成するための障害を注入します。
sudo acs-plugin-manager --exec --plugin ACS-ECS-HighMemory --params inject,percent=90,rate=20,duration=120次のような出力が返された場合、障害は正常に注入されています。

注入結果を検証します。
top コマンドによる確認
topコマンドを実行します。次に、Mキーを押してプロセスをメモリ使用量でソートし、mキーを押してメモリ使用量のプログレスバーを表示します。出力には、現在のメモリ使用率が 90.2% であり、
trigger_oom注入プロセスがメモリの 84.4% を使用していることが示されます。
タイムアウト後、システムは自動的にメモリを解放します。メモリ使用量はドリル前のレベルに戻り、注入プロセスは終了します。

コンソールのインスタンスモニタリング詳細での確認

コンソールのインスタンス詳細で、メモリ使用量を確認します。障害が注入されると、システムのメモリ使用率は指定されたレートで増加します。ターゲットの 90% に達し、120 秒間その状態を維持します。その後、メモリ使用量は注入前のレベルまで低下し、ドリルは完了します。
一般的な OOM の原因と解決策
高いメモリ使用量は、システムのスタッタリングや内部サービスの応答遅延を引き起こす可能性があります。この問題を解決するには、高いメモリ使用量の原因をトラブルシューティングし、分析します。詳細については、「Linux インスタンスのメモリ使用率が高い場合の対処方法」をご参照ください。
OOM イベントは、インスタンスの利用可能なメモリが不足しているか、リソースが頻繁にリクエストされてリソース枯渇につながることが原因で発生する場合があります。この問題を解決するには、OOM イベントの原因を分析します。詳細については、「Linux インスタンスの OOM 問題の対処方法」をご参照ください。