CPU使用率の過剰への対応

事象説明

    アプリケーションプロセスのCPU使用率が100%近くになった、または以前に比べてアプリケーションプロセスのCPU使用率が著しく大きくなったことを、ここではCPU使用率の過剰として扱いますが、システム構築段階で試行させてみたら考えられない程CPUを消費していた、という場合も本記述を参考にしてください。CPU使用率の過剰としては主に以下のケースが考えられます。

状況の確認方法

    タスクマネージャ(Windows)またはtopコマンド(UNIX)を使用し、アプリケーションプロセスのCPU使用率が大きくなっていないか確認して下さい。以下の名前のプロセスを調べてください。

      (Windows)
      THTPPCTL_2010.exe
      (UNIX)
      THTPPJAVA2

問題の検出方法

    実行時間の上限の設定

      CPUループの回避策として該当オペレーションに「実行時間の上限」の設定を行なうことによりCPUループ事象を回避することができます。「実行時間の上限」で設定した時間経過しても応答がない場合はTPモニタにより強制終了させられます。統合運用管理ツールから該当オペレーションの「オペレーション制御」タブにある「実行時間の上限」の設定を見直してください。設定の際は運用アシスタントの実行時間の上限の適正値算出機能を利用することができます。詳細は、 [ 構築・運用 > TPシステム > 運用アシスタント > 実行時間の上限の適正値算出 ] を参照してください。

    運用アシスタントによりスローダウン検出

      CPUを多く消費した影響により、個々の処理が遅延した場合、運用アシスタントのスローダウン障害検出機能により検出されます。スローダウンが検出されると以下のメッセージがイベントログ・syslogに通知されます。

      OTX20110100 オペレーション<zzz>のスローダウンを検出しました。current:平均実行時間=<xxx>秒。normal:平均実行時間=<www>秒。プロセスグループ=<vvv>。 ObjectName=<yyy>
      OTX20110100 The Operation <zzz> get late. Average of current time is <xxx>s. Average of normal time is <www>s. The Process Group is <vvv>. The ObjectName is <yyy>
      詳細は、 [ 構築・運用 > TPシステム > 運用アシスタント > スローダウン障害の検出 ] を参照してください。

採取資料
対象APの特定

    運用管理コマンドを使用すると、CPU使用率の高いプロセスグループを特定できます。以下のコマンドにより、全プロセスグループのCPU使用率を取得できます。このCPU使用率には、プロセスグループに含まれるプロセスのCPU使用率の合計が表示されます。

      otxadmin> get --monitor *.cpurate-Current

    統合運用管理ツールからも、プロセスグループごとのCPU使用率を確認することができます。プロセスグループの「動作情報」タブにある「プロセス情報」で確認できます。「統計情報」のプロセスグループのCPU使用率からも確認できます。こちらはプロセスグループに含まれるプロセスのCPU使用率の合計が表示されます。オペレーションジャーナルを採取することにより、対象APを特定することもできます。

原因の特定

    CPUループが発生している場合は、統合運用管理ツールから、プロセスグループの「動作情報」タブにある「スレッド情報」の[CPU使用率]を連続して参照(F6)し、CPU使用率の高いスレッドを確認してください。特定のスレッドでCPU使用率が高い場合は、そのスレッドで実行中のオペレーション処理内で、CPUループが発生している可能性があります。特に、[経過時間]が[稼働情報の採取と設定更新の間隔]より長く、CPU使用率が100%近くある場合は、該当の処理でCPUを消費していることがわかります。

    ユーザモードCPU使用時間が増加しているのであれば、サーバAPの処理に問題がある可能性があります。カーネルモードCPU使用時間が多い場合は、リソース使用の効率化等を検討してください。

    該当APがJavaの場合、CPUループ発生中に、統合運用管理ツールより該当プロセスグループを選択して、右クリックで「スタックトレースの採取(stackTrace)」を実行してください。数回にわたり、定期的にスタックトレースを採取してください。V8.2からは自動で3秒間隔5回のスタックトレース採取をしてアプリケーションログに出力します。これにより行レベルでCPUループ発生箇所を調査できます。

    サーバAPからの応答がある場合は、オペレーションジャーナルを採取し、オペレーションごとのCPU使用時間を調査することにより、CPUを多く消費しているオペレーションを特定できます。

復旧方法

    該当プロセスグループを再起動することで一時的に復旧する可能性もありますが、アプリケーションの処理を見直す必要があります。なおCPUループしている場合は、「通常停止(stop)」は失敗してしまう可能性があります。その場合は「強制停止(forcibleStop)」させてください。

    問題のあるオペレーションを一時的に閉塞することにより、状況の悪化を和らげることができる可能性もあります。

予防のための対策

    この問題を予防するための対策については以下の方法があります。

      問題のAPの修正

        完全に問題を解決するためにはAPを修正する必要があります。プロセスグループの「スレッド情報」を定期的に参照して、CPUを消費しているスレッドで実行中のオペレーションを特定できます。
        なお該当APがJavaである場合、該当アプリケーショングループを強制停止することで、CPUループによりストール箇所の特定を行なうことができます。

      実行時間の上限の設定

        原因不明などでAPの修正が困難な場合は回避策として該当オペレーションに実行時間の上限の設定を行なうことによりCPUループ事象を回避することができます。実行時間の上限で設定した時間経過しても応答がない場合はTPモニタにより強制終了させられます。統合運用管理ツールから該当オペレーションの「オペレーション制御」タブにある「実行時間の上限」の設定を見直してください。設定の際は運用アシスタントの実行時間の上限の適正値算出機能を利用することができます。詳細は、 [ 構築・運用 > TPシステム > 運用アシスタント > 実行時間の上限の適正値算出 ] を参照してください。


関連情報