インジェクションプロセスを使用してメモリを継続的に消費することにより、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 インスタンスで [クラウドアシスタント] のステータスが [正常] です。詳細については、「クラウドアシスタントのステータスを表示し、異常を処理する」をご参照ください。
障害を注入する
sudo 権限を持つユーザーとして ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
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。
障害が注入されたかどうかを確認します。
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 インスタンスを再起動することをお勧めします。
ドリルケース
120 秒間、20 MB/秒のレートでメモリの 90% を占有することが想定される障害を注入します。
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% を占有していることを示しています。障害がタイムアウトした後、システムは自動的にメモリを解放します。メモリ使用量は障害注入前のレベルに減少し、インジェクションプロセスは終了します。
ECS コンソールのインスタンス詳細ページの [監視] タブに移動する
ECS コンソールのインスタンス詳細ページの [監視] タブで、メモリ使用量チャートを確認します。システムのメモリ使用量は、障害が注入された後、指定されたレートで増加し、ターゲットのメモリ使用量である 90% に達し、120 秒後に注入前のレベルに低下します。
一般的な OOM の原因と解決策
メモリ使用量が多いと、システムの動作が遅くなったり、内部サービスの応答が遅くなったりする可能性があります。メモリ使用量が多い原因のトラブルシューティングと分析を行い、問題を解決できます。詳細については、「Linux インスタンスのメモリ使用量が多い場合の対処方法」をご参照ください。
OOM は、ECS インスタンスの使用可能なメモリが少なすぎるか、リソースが頻繁にリクエストされ、システムリソースが枯渇するために発生する可能性があります。 OOM の原因を分析し、問題を解決できます。詳細については、「Linux インスタンスでの OOM エラーの処理方法」をご参照ください。