症状
CPU 使用率またはシステム負荷が高いと、以下の症状が発生する可能性があります。
アプリケーションサービスの問題
SSH リモート接続が遅延したり応答しなくなったりし、深刻な場合は接続に失敗します。
ご利用の Web サイトまたはアプリケーションの応答時間が大幅に増加し、ページの読み込みが遅くなります。
リクエストが頻繁にタイムアウトし、API 呼び出しが失敗し、サービス全体の処理能力が著しく低下します。
システムリソースの異常
インスタンスの CPU 使用率が継続的に 80 % を超え、場合によっては 100 % に近づきます。
システム負荷 (ロードアベレージ) が論理 CPU コア数を常に上回っています。たとえば、4 コアのインスタンスでロードアベレージが 4 を超えています。
CloudMonitor が SMS またはメールでシステム負荷の高さに関するアラートをトリガーしています。
原因
CPU 集約型プロセス:この問題は、無限ループや複雑な計算タスク、高同時実行リクエストなど、アプリケーションロジックの不備によって引き起こされることが多く、正当なトラフィックと悪意のある攻撃の両方が含まれる可能性があります。
I/O パフォーマンスボトルネック:頻繁なディスク読み書き操作またはストレージパフォーマンスの不足により、プロセスが I/O の完了を長時間待機し、システムのロードアベレージが増加します。
カーネルまたはシステムコール:頻繁なコンテキストスイッチ、カーネルタスク、またはドライバーの問題により、カーネルモードでの CPU 使用率が高くなります。
異常または悪意のあるプログラム:インスタンスが暗号通貨マイニングソフトウェア、トロイの木馬、または大量のコンピューティングリソースを消費する隠しプロセスを持つルートキットに感染しています。
解決方法
top ツールを使用して、CPU 使用率またはシステム負荷の高さの主な原因(ユーザースペース、カーネルスペース、I/O 待機など)を特定します。その後、perf、iotop、または vmstat などのツールを使用して詳細な分析を行い、問題を解決します。
ステップ 1: CPU ボトルネックの特定
VNC 接続を使用して ECS インスタンスにログインします。
ECS コンソール - インスタンス に移動します。上部ナビゲーションバーで対象のリージョンおよびリソースグループを選択します。
対象インスタンスの詳細ページに移動します。接続 をクリックし、VNC を選択します。ユーザー名とパスワードを入力して、ECS インスタンスにログインします。
システム負荷およびプロセスのアクティビティを確認します。
sudo top問題の原因を特定します。
topインタラクティブインターフェイスで、Pキーを押して、CPU 使用率の高い順にプロセスをソートします。最も CPU を使用しているプロセスのプロセス ID (PID) およびコマンド名 (COMMAND) を特定します。java、python、またはphp-fpmなどのアプリケーションプロセスが継続的に CPU の 80 % 以上を使用している場合は、「ビジー状態のアプリケーションプロセスの対処」をご参照ください。%Cpu(s)行の I/O 待機 (wa) 値が継続的に 20 % を超え、ユーザースペース (us) およびカーネルスペース (sy) の値が低く、ロードアベレージが CPU コア数を大幅に上回っている場合は、CPU がディスク I/O を待機するために多くの時間をアイドル状態で費やしていることを示しています。この場合は、「ディスク I/O ボトルネックの対処」をご参照ください。プロセスがディスク I/O 操作の完了を待機している間、割り込み不能なスリープ状態 (D 状態) に入り、終了できません。多数のプロセスが D 状態にある場合、ディスクの応答が遅く、CPU が待機を強いられることでシステム負荷が増加していることを示します。
%Cpu(s)行のシステム (sy) 値が継続的に 30 % を超えている場合は、通常、カーネルが頻繁にシステムコールを実行したり割り込みを処理したりしていることを示します。この場合は、「ビジー状態のカーネルまたはシステムコールの対処」をご参照ください。%Cpu(s)行の softirq (si) 値が継続的に 15 % を超えている場合は、ネットワークトラフィックが多いことを示します。この場合は、「ビジー状態のネットワーク割り込みの対処」をご参照ください。
ステップ 2: 問題の分析と解決
ビジー状態のアプリケーションプロセス
コードの分析と最適化:
パフォーマンスプロファイリングツールを使用して、コード内のホットスポットを特定します。
Java アプリケーション:
jstack <PID>を使用してスレッドスタックをエクスポートします。RUNNABLE状態のスレッドを検索し、呼び出しスタックが特定のメソッドで長時間停止していないかを確認します。C/C++ アプリケーション:
perf top -p <PID>を使用して、最も CPU を使用している具体的な関数シンボルを表示します。
分析に基づき、アルゴリズムを最適化したり、無限ループを修正したり、不要な計算を削減してください。
アプリケーションレイヤー攻撃への対処:悪意のあるアプリケーションレイヤー CC 攻撃(大量の不審な HTTP リクエストが特徴)を受けている場合は、保護のために Web アプリケーションファイアウォール (WAF) を導入してください。詳細については、「WAF を使用した ECS インスタンスの CC 攻撃からの保護」をご参照ください。
リソースのスペックアップ:ボトルネックが通常のビジネス成長によって引き起こされている場合は、インスタンスタイプをスペックアップしてください。
ディスク I/O ボトルネック
高 I/O を引き起こしているプロセスを特定します:Linux システムでのディスク I/O 負荷の高さに関するトラブルシューティング。
D 状態のプロセスの蓄積を確認します:
sudo ps -axjf | grep " D"アプリケーションの最適化:ログレベルを下げたり、データベースクエリにインデックスを追加したりして、ディスク読み書き操作を削減します。
ストレージのスペックアップ:クラウドディスクのカテゴリをスペックアップ(例:ESSD PL1 から ESSD PL2/PL3 へ)することで、IOPS およびスループットを向上できます。クラウドディスクの最大 IOPS は、アタッチされているインスタンスタイプにも制約されます。インスタンスタイプの IOPS 制限がクラウドディスクの性能を下回る場合は、インスタンスタイプをスペックアップする必要があります。
システムの再起動:システムを再起動することで、D 状態のプロセスの蓄積を解消できます。
ビジー状態のカーネルまたはシステムコール
コンテキストスイッチを確認します:
vmstat 1コマンドを実行し、cs(コンテキストスイッチ)列の値を観察します。この値が継続的に 100,000 を超える場合、コンテキストスイッチのレートが過剰です。アプリケーションが過剰にスレッドを作成および削除していないかを確認してください。カーネルタスクを確認します:kswapd0 プロセスの CPU 使用率が高い場合は、物理メモリが不足しており、カーネルが頻繁にメモリを回収していることを示します。これを解決するには、インスタンスタイプをスペックアップしてください。
物理メモリが不足すると、kswapd0 が頻繁にメモリページをスキャン・回収・スワップアウトします。これらのコンピューティング集約型タスクは大量の CPU リソースを消費し、CPU 使用率の高さを引き起こします。
ビジー状態のネットワーク割り込み
トラフィックの分析:
iftopまたはiptraf-ngなどのツールを使用して、ネットワークトラフィックの送信元および種類を分析します。構成の確認:ネットワークワークロードが高い場合は、ネットワークインターフェースカード (NIC) のマルチキューを有効にして、割り込みを複数の CPU コアに分散できます。
ネットワーク攻撃への対応:
攻撃者の IP アドレスの特定:セキュリティグループルールを管理して、既知の悪意のある IP アドレスをブロックできます。
大規模 DDoS 攻撃への対処:大規模な DDoS 攻撃中、ピークトラフィックが Anti-DDoS Origin のブラックホールしきい値 を超えると、ブラックホールフィルタリングがトリガーされ、サービスにアクセスできなくなります。サービス可用性を維持するには、Anti-DDoS Pro を有効にしてください。
次のステップ
モニタリングとアラートの設定:CPU 使用率、システム負荷、I/O 待機などのメトリックに対して適切なアラートのしきい値を設定し、早期警告を受信します。Linux システムメトリックの履歴分析を行うには、atop ツールを使用して Linux システムメトリックをモニターできます。
定期的なセキュリティチェックの実施:Security Center を使用して、ご利用のホストに対して定期的に脆弱性スキャン、ウイルススキャン、およびベースラインチェックを実行し、潜在的なセキュリティリスクを修正します。
定期的なレビューと最適化の実施:システムおよびアプリケーションのパフォーマンスとコードを定期的にレビューし、潜在的なパフォーマンスボトルネックを特定・解決します。
キャパシティプランニング:ビジネス成長トレンドに基づいてリソースキャパシティを計画し、将来的な負荷に対応できるようにします。