症状
CPU 使用率または負荷が高い場合、次の現象が発生することがあります。
ビジネスサービスの異常
Secure Shell Protocol (SSH) のリモート接続が遅い、または応答しない。深刻な場合は、接続を確立できません。
Web サイトやアプリケーションの応答時間が大幅に増加し、ページの読み込みが遅くなります。
リクエストが頻繁にタイムアウトし、API 呼び出しが失敗し、サービスキャパシティが低下します。
システムリソースの異常
インスタンスの CPU 使用率が常に 80% を超える、あるいは 100% に近くなります。
システムの平均負荷が論理 CPU コアの数を常に超えます。たとえば、4 コアのマシンで負荷が 4 を超えます。
CloudMonitor がショートメッセージやメールなどの高負荷アラートをトリガーします。
原因
CPU 負荷の高い計算プロセス:コードロジックの問題 (無限ループ、複雑な計算タスク、高い同時実行性のビジネスリクエストなど) により、特定のプロセスが大量の CPU リソースを消費します。
I/O パフォーマンスボトルネック:頻繁なディスクの読み書きや低いストレージパフォーマンスにより、プロセスが I/O を長時間待機することになります。これにより、システムの平均負荷が増加します。
カーネルまたはシステムコール:頻繁なコンテキストスイッチ、カーネルタスク、またはドライバーの例外により、カーネルモードでの CPU 使用率が増加します。
異常なプログラムまたは悪意のあるプログラム:インスタンスがマイニングプログラムやトロイの木馬ウイルスに感染している、または大量の計算リソースを消費する隠れたルートキットプロセスが存在します。
ソリューション
まず、top ツールを使用して、高い CPU 使用率または負荷の原因となっているメトリックを特定します。これは、ユーザーモード、カーネルモード、または I/O 待機のいずれかである可能性があります。次に、perf、iotop、vmstat などのツールを使用してメトリックタイプを分析します。最後に、問題を最適化または解決するための措置を講じます。
ステップ 1:CPU ボトルネックメトリックの特定
VNC 接続を使用して Elastic Compute Service (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 操作を待機すると、D 状態 (割り込み不可能なスリープ) に入ります。この状態のプロセスを終了させることはできません。D 状態のプロセスが多いことは、ディスク応答が遅いことを示します。これにより、CPU は待機を強いられ、システム負荷が増加します。
%Cpu(s)のsy(システム) が常に 30% を超える場合、カーネルが頻繁にシステムコールを実行しているか、割り込みを処理しています。この場合は、「負荷の高いカーネルまたはシステムコールの処理」をご参照ください。%Cpu(s)のsi(softirq) が常に 15% を超える場合、ネットワークトラフィックが高い状態です。この場合は、「負荷の高いネットワーク割り込みの処理」をご参照ください。
ステップ 2:問題の分析と解決
負荷の高いビジネスプロセスの処理
コードの分析と最適化:
パフォーマンス分析ツールを使用して、コードのホットスポットを特定します。
Java アプリケーション:
jstack <PID>を使用してスレッドスタックをエクスポートします。RUNNABLE状態のスレッドを見つけます。呼び出しスタックが特定のメソッドでスタックしていないか確認します。C/C++ アプリケーション:
perf top -p <PID>を使用して、CPU リソースを消費している関数シンボルを表示します。
分析に基づいて、アルゴリズムを最適化したり、無限ループを修正したり、不要な計算を削減したりします。
リソースのスペックアップ:リソースボトルネックが通常のビジネスの成長によって引き起こされる場合は、インスタンスタイプをスペックアップします。
ディスク I/O ボトルネックの処理
高 I/O プロセスを特定します。詳細については、「Linux システムにおける高いディスク I/O 負荷のトラブルシューティング」をご参照ください。
D 状態のプロセスの蓄積を確認します。
sudo ps -axjf | grep " D"対処法:
アプリケーションの最適化:ログレベルを下げます。データベースクエリにインデックスを追加して、ディスクの読み書きを削減します。
ストレージのスペックアップ:ディスクカテゴリをアップグレードします。たとえば、ESSD PL1 から ESSD PL2 または PL3 にアップグレードして、1 秒あたりの入出力操作 (IOPS) とスループットを向上させます。ディスクの IOPS は、最終的にアタッチされているインスタンスタイプによって制限されます。インスタンスタイプの IOPS 制限がディスクの性能よりも低い場合は、インスタンスタイプもスペックアップする必要があります。
システムの再起動:D 状態のプロセスが蓄積している場合、システムを再起動することで問題を解決できます。
負荷の高いカーネルまたはシステムコールの処理
コンテキストスイッチの確認:
vmstat 1コマンドを実行します。cs(コンテキストスイッチ) 列の値を確認します。値が常に 100,000 を超える場合、コンテキストスイッチが頻繁すぎます。アプリケーションがスレッドを過剰に作成または破棄していないか確認します。カーネルタスクの確認:kswapd0 プロセスの使用率が高い場合、物理メモリが不足しており、カーネルが頻繁にメモリを再利用しています。インスタンスタイプをスペックアップします。
物理メモリが不足すると、kswapd0 は頻繁にページをスキャンし、メモリを再利用し、ページをスワップアウトします。これらの計算負荷の高いタスクは多くの CPU リソースを使用し、使用率を増加させます。
負荷の高いネットワーク割り込みの処理
トラフィックの分析:
iftopやiptraf-ngなどのツールを使用して、ネットワークトラフィックのソースとタイプを分析します。高いネットワーク負荷に対処するには、ネットワークインターフェイスカード (NIC) のマルチキューを有効にします。これにより、割り込みが複数の CPU コアに分散されます。
セキュリティチェックの実行:Security Center に移動して、ネットワーク攻撃がないか確認します。
推奨事項
監視とアラートの設定:CPU 使用率、負荷、I/O 待機などのメトリックに対して、適切なアラートのしきい値を設定します。これにより、潜在的な問題を早期に警告できます。過去の Linux システムメトリックを確認・分析するには、atop ツールを使用して Linux システムメトリックを監視します。
定期的なセキュリティ検査の実施:Security Center を使用して、ホストの脆弱性、ウイルス、ベースラインリスクを定期的にスキャンします。潜在的なセキュリティ問題を修正します。
定期的なレビューと最適化の実施:システムとアプリケーションのパフォーマンスを定期的に監査します。コードをレビューして、潜在的なパフォーマンスボトルネックを見つけて解決します。
キャパシティプランニング:ビジネスの成長傾向に基づいてキャパシティを計画します。これにより、システムリソースが将来の負荷増加に対応できるようになります。