リソースの過剰使用により、Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスが応答しなくなりました。どうすればこれを防ぐことができますか?
簡単な説明
インスタンスが応答しなくなる一般的な原因はいくつかあります:
- **メモリ:**EC2 インスタンスには、デフォルトではスワップスペースが割り当てられていません。メモリが不足すると、Linux Out Of Memory (OOM) Manager が起動します。OOM Manager は、データベース、ウェブサーバー、SSH サービスなどのプロセスを終了します。
- **ネットワーキング:**ネットワークがなければ、システムはステータスチェックからの ARP 要求に応答できません。これが発生すると、インスタンスは他のホストと通信できなくなります。
- **入出力オペレーション:**ディスク I/O がないと、読み取りまたは書き込み命令が停止します。たとえば、一時ファイルの作成、システムライブラリからの読み込み、またはデータベースなどです。
- **CPU:**前述のすべてのタスクを実行するには CPU 時間が必要です。長時間の CPU 使用率が 100% になると、カーネルは通常のオペレーティングシステム操作を実行できなくなります。
これらの問題が積み重なって、雪だるま式に増えることもあります。たとえば、メモリが不足し、OOM Manager が重要なプロセスを終了したとします。これで、停止した最初のプロセスに依存する 2 番目のプロセスが、大量の CPU サイクルを開始します。このタスクがディスク関連の場合、このサイクルによって Amazon Elastic Block Store (Amazon EBS) のボリュームが使い果たされる可能性もあります。また、応答しないインスタンスからの通信を想定している別のインスタンスに問題が転送される可能性もあります。
解決策
システムの CPU 使用率が高い場合や、リソースの過剰使用により応答しなくなることが多い場合は、以下を実行してください:
情報を集める
Amazon CloudWatch を使用して CPU 使用率をモニタリングする
Amazon CloudWatch などのモニタリングツールを使用して、リソースの使用率が高い傾向とパターンを観察します。
システム監視ツールを使用する
複数のサービスがあり、どれがリソースを過剰に使用しているのかわからない場合は、atop などのユーティリティをインストールしてください。htop、** top**、sar などのツールを使用することもできます。これらのツールはすべて、CPU 使用率が最も高いプロセスを特定するのに役立ちます。詳細については、以下を参照してください:
CPU 使用率が高いプロセスの詳細情報を取得する
プロセスに関するより詳細な情報を取得するには、pidstat コマンドまたは ps コマンドを使用してください。コマンド出力に表示される情報は、プロセスがシステムプロセスであるかユーザープロセスであるかを判断するのに役立ちます。これらのコマンドの実行に必要なツールの設定方法と使用方法の詳細については、以下を参照してください:
システムログを確認する
高い CPU 使用率に関連するエラーまたは警告を確認してください。たとえば、dmesgコマンドを使用してカーネルメッセージを表示し、システムメッセージの /var/log/syslogファイルまたは /var/log/messagesファイルを表示します。 コマンド出力とログファイルの内容は、問題の原因となっているシステムまたはアプリケーションの問題を特定するのに役立ちます。
コマンド履歴を確認
コマンドの履歴を確認して、ヒューマンエラーがあったかどうかを確認します。コマンド履歴は通常 ~/.bash\ _history ファイルにあります。
予定されているジョブを確認する
CPU 使用率が高くなる可能性のあるスケジュールされたジョブや cron ジョブが EC2 インスタンスで実行されていないか確認してください。まず、CPU 使用率が高いときのタイムスタンプを確認します。次に、次のコマンドを実行して cron ジョブを一覧表示します:
sudo crontab -l
sudo cat /etc/crontab
sudo cat crontab -l -u <username>
上記のコマンドは、root ユーザーの crontab 設定を一覧表示します。特定のユーザーの cron をチェックするには、コマンドに**-u** オプションを含めてください。次に、問題に気付いた時刻を探します。以下を含むログを確認してください:
/var/log/messages
/var/log/syslog
/var/log/dmesg
/var/log/cron.log
grep コマンドを使用して、調査対象の特定の cron ジョブに関連するエントリをフィルタリングします。特定された cron のいずれかに関連するエラーが発生したかどうかを確認してください。
メモリ使用率を確認する
メモリ使用率が高いと、スワップス領域の使用により CPU 使用率が高くなる可能性があります。free コマンドを使用してメモリ使用率を確認します。必要なツールの設定方法と使用方法の詳細については、redhat.com ウェブサイトの「free コマンドを詳しく見る」を参照してください。
ネットワークトラフィックを確認する
ネットワークトラフィックが多いと、特にインスタンスが大量のネットワークリクエストを処理している場合、CPU 使用率が高くなる可能性があります。iftop コマンドを使用してネットワークトラフィックを監視し、必要に応じてネットワーク設定を最適化するか、インスタンスタイプをアップグレードすることを検討してください。必要なツールの設定方法と使用方法の詳細については、redhat.com ウェブサイトの「iftop によるオンデマンドの Linux インターフェース分析」を参照してください。
ディスク I/O を確認する
ディスク I/O が多いと、CPU 使用率が高くなる可能性があります。iostat コマンドを使用してディスク I/O を監視し、大量の I/O を引き起こす可能性のあるプロセスを特定します。詳細については、redhat.com ウェブサイトの「Linux コマンドラインからの I/O レポート」をご覧ください。
取得したデータに基づいて行動する
コードを最適化する
アプリケーションの CPU 使用率が高くなっている場合は、コードを最適化してください。そのためには、パフォーマンスのボトルネックを特定して解消する必要があります。perf や strace などのプロファイリングツールは、問題のあるコードの特定に役立ちます。必要なツールの設定方法と使用方法の詳細については、以下を参照してください:
インスタンスをアップグレードする
プロセスが大量のユーザーを取り込んでいるなどの正当な理由で大量のリソースを使用している場合は、インスタンスのアップグレードを検討してください。
AWS Compute Optimizer は、使用する適切なインスタンスタイプとサイズを決定するのに役立ちます。Amazon EC2 Auto Scaling を使用して水平スケーリングを検討することもできます。
Linux 監査ルールを設定する
ユーザーコマンドや設定変更をより詳細に把握したい場合は、変更を追跡するように Linux Audit システムを設定できます。
将来の過剰使用を防ぐ
- 新しいアプリケーションを本番環境にデプロイする前に、テスト環境とベンチマークを作成して、必要なコンピューティング、メモリ、EBS、ネットワークを特定します。フォールトトレランスを構築しながら、ベンチマークに従ってデプロイできます。詳細については、以下を参照してください:
障害を防ぐために分散システムにおけるインタラクションを設計する
チュートリアル: スケーリングされ負荷分散されたアプリケーションをセットアップする
- インスタンスで実行されているアプリケーションのパフォーマンスが最適化されていることを確認してください。最適化には、構成ファイルの調整、データベースクエリの最適化、またはコードの最適化が含まれます。
- アプリケーションがデータベースを多用する場合は、キャッシュを実装してデータベースへのクエリの数を減らすことを検討してください。
- ソフトウェアに最新のセキュリティパッチとバグ修正が適用されていることを確認してください。古いソフトウェアがパフォーマンスの問題や脆弱性を引き起こし、CPU 使用率が高くなる可能性があります。
- アプリケーションが大量のトラフィックを受け取る場合は、ロードバランサーを使用してトラフィックを複数の EC2 インスタンスに分散することを検討してください。ロードバランサーは、1 つのインスタンスの CPU 使用率を下げます。
- 引き続きインスタンスを監視し、特定のリソース使用量のしきい値に対してアラームを作成します。