CPU使用率が100%を越える

問題

New Relic APM と Servers で CPU 使用率が矛盾した状態となったり、CPU 使用率が 100 %以上になったりします。

原因

APM の CPU 使用率は、Servers の CPU 使用率とは異なります。

  • APM における CPU 使用率とは、指定されたサーバー上のアプリケーションやサービスの全インスタンスの使用状況を集計したものです。
  • Servers における CPU 使用率とは、設定済みのサーバー上の全 CPU の平均使用率を測定したものです。

詳細については、以下の例や製品ごとの説明をご覧ください。

CPU 使用率不一致の例

以下は、APM と Servers 間の CPU 使用率の不一致の例です。

This image compares two different CPU metrics in APM and servers.
APM > Monitoring > (選択したアプリ)Servers > Servers: CPU metrics in APM と Servers の CPU 使用率が異なった値を示しています。

New Relic APM

アプリの CPU 使用率を確認するには、New Relic のメニューバーから、APM > (選択したアプリ) > Monitoring > Overview を選択します。インスタンス数が各サーバーの下に記載されています。(例: 55 instances)

APM の CPU 使用率とは、指定されたサーバー上のアプリやサービスの全インスタンスの総 CPU 使用率を計測したものです。この割合はサーバー上の複数コアで実行されているインスタンス数に影響を受けます。1サーバー上またはマルチコアサーバー環境でサービスを複数のインスタンスで動かしていると、CPU 使用率が100パーセントを遥かに上回る場合があります。

APM における CPU 使用率とは、総CPU時間をクロック時間で割った値です。

CPU usage = (instance CPU time + instance CPU time + [...]) / (clock time)

例: クアッドコアプロセッサーへのアップグレード

サーバーアーキテクチャを変えずにデュアルプロセッサからクアッドプロセッサへアップグレードしても、同じ負荷で同じアプリケーションの場合は、ほぼ同じ CPU 使用率が表示されるはずです。New Relic の計算を正規化した場合、使用しているサイクル数は同じでも、アップグレードにより CPU 使用率の急激な減少をもたらすように思われます。インスタンスを追加しても、コードは効率的にはなりません。

New Relic Servers

以下の手順により、個々のサーバーの CPU 使用率を表示できます。

  1. New Relic メニューバーから、Servers を選択する。
  2. オプション: CPU の列見出しを選択すると、CPU の使用率順で並び替えられる。
  3. CPU 使用率の詳細情報にドリルダウンするには、個々のサーバーを選択する。
プラットフォーム 計算式
Linux

Linux 用 Servers は、与えられたサーバーの全 CPU の平均 CPU 使用率を計測します。Servers は、CPU がビジーである時間の平均使用率に基づいて正規化されたメトリクスを生成します。つまり、そのサーバーにコアを追加すると、使用可能な CPU 容量が増加するということです。

CPU usage = (CPU time + CPU time + [...]) / (clock time * number of CPUs)
Windows 用 Servers

Windows 用 Servers は、WMI (Windows Management Instrumentation [external link] ) を使って、単一のメトリックとして、全 CPU とそのコアの使用率を収集します。以下のクエリを使用して、20秒間に1回、このメトリックを収集します。

SELECT PercentPrivilegedTime,PercentUserTime,TimeStamp_Sys100NS FROM Win32_PerfRawData_PerfOS_Processor WHERE Name = '_Total'

Windows 用 Servers はその後、個別に PercentPrivilegedTimePercentUserTime を計算します。

( (newCPUTime - oldCPUTime) / (newTimeStamp - oldTimeStamp) ) * 100