CPU使用率の過剰への対応

事象説明

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

状況の確認方法

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

      (Windows)
      THTPPCTL_2010.exe
      (UNIX)
      THTPPJAVA2

問題の検出方法
    フェイルセーフ機能よるスローダウン検出

      CPUを多く消費した影響により、個々の処理が遅延した場合、フェイルセーフ機能(障害対策機能のスローダウン障害対策機能)により検出されます。異常とみなす応答時間[faultResponseTime](既定値:40秒)を超過した場合に、警告ログ(OTX011914xx)をアプリケーションログに出力します。詳細は、 [ 構築・運用 > 診断サービス > 障害対策機能 > スローダウン障害対策機能 > スローダウン障害対策機能詳細 ] を参照してください。

    運用アシスタントによるスローダウン検出(※運用アシスタント機能を利用している場合)

      WebOTX V8以前の互換動作のためにスローダウンを監視する機能として運用アシスタント機能を選択している場合(既定値「フェイルセーフ機能を使用する」)、運用アシスタントによりスローダウンが検出されます。デフォルトではこちらではなく、フェイルセーフ機能の異常とみなす応答時間[faultResponseTime](既定値:40秒)を超過した場合にフェールセーフが検出される点に注意してください。スローダウンを監視する機能として何を選択しているかは、次のコマンドで確認できます。

      otxadmin>get tpsystem.detectSlowdownMode
      detectSlowdownModeは0か1で表示され、0 は「フェイルセーフ機能を使用する」 、1 は「運用アシスタント機能を使用する(V8互換機能)」、2は「スローダウンを監視しない」を表します。

      運用アシスタント機能を選択している場合、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 tpsystem.applicationGroups.*.processGroups.*.cpurate-Current

      オペレーションジャーナルを採取することにより、対象APを特定することもできます。詳細は[TPシステム > 統計情報(オペレーションジャーナル) ] を参照してください。

原因の特定

    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の修正が困難な場合は回避策として、フェイルセーフ機能「プロセス異常終了可否」[processAbnormallyEnd](既定値:false)をtrueとしておくことで、「障害回復検証時間」(既定値:300秒)を経過しても障害から回復しなかった場合に、スレッドダンプを取得して、プロセスを終了することができます。詳細は、 [ 構築・運用 > 診断サービス > 障害対策機能 > スローダウン障害対策機能 > スローダウン障害対策機能詳細 ] を参照してください。

      実行時間の上限の設定(※運用アシスタント機能を利用している場合)

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


    関連情報