仕事でサーバーのパフォーマンス監視と死活監視に New Relic APM を利用している。New Relic APM を使うと自動的に Apdex という指標を算出してくれるのだが、今日は仕事でこの指標について調べた。
会社の qiita team には投稿したのだが、せっかくなのでこっちにもコピーしておこう。特に問題ないはず。
Apdex とは
概要
Apdex とは Application Perfomance Index の略で、「アプリケーションやサービスのレスポンス時間に対するユーザーの満足度」を示す指標です。一応、The Alliance という団体によって標準化されてた指標です。(New Relic の独自指標と説明しているサイトもあるけどそれは嘘。)
Apdex は 0 から 1 の小数として示されます。 値が増加すればするほどユーザーがレスポンス時間に満足していることを示します。
- 値が 0: すべてのユーザがレスポンス時間に不満を持っています。
- 値が 1: すべてのユーザがレスポンス時間に満足しています。
メリット
Apdex を用いるメリットは、正規化された指標であるため複数のサービスを同じ指標で比較できる点です。
アプリケーションの平均レスポンス時間をそのまま評価する方法があります。ただし、複数のサービスを展開していると、それぞれユーザが満足するレスポンス時間が異なるため、そのまま評価できません。
例えば、あるサービス群の平均レスポンス時間が、
- サービス A: 50 [ms]
- サービス B: 2000 [ms]
- サービス C: 150 [ms]
だった場合に、単にサービス B がよくないとはいえません。 もともと時間のかかるサービスでユーザーがそれを受け入れているかもしれません。 加えて、平均を用いるといくつかの例外的な時間のかかるリクエストの影響を非常に受けやすいという点もデメリットです。
このような場合に、Apdex を用いて比較すると、
- サービス A: 0.9
- サービス B: 0.8
- サービス C: 0.5
上記のようにサービス C に改善が必要なことがすぐに分かります
算出方法
ユーザがそのサービスのレスポンス時間として満足できる値を T とします。 この値は各サービスごとに決定する必要があります。
次に実際のレスポンス時間 t を元にして、以下の三項目のどれかに分類して、それぞれの個数をカウントします。
- 満足(Satisfied): t <= T(レスポンス時間が T 以下)
- 許容(Tolerating): T < t && t <= 4 * T (レスポンス時間が T より大きく、4T 以下)
- 不満(Frustrated): 4T < t(レスポンス時間が 4T より大きい)
それぞれの個数を、
- 満足リクエストの数: reqSatisfied 個
- 許容リクエストの数: reqTolerating 個
- 不満リクエストの数: reqFrustrated 個
とします。これらの値を使って Apdex スコアは以下の様に求まります。
Apdex = (reqSatisfied + 0.5 * reqTolerating) / (reqSatisfied + reqTolerating + reqFrustrated)
Apdex とは満足リクエスト率と、許容リクエスト率に半分重み付けした値の足し算となります。
FAQ
Apdex はどれくらいだったらいいの?
アプリケーションによりますが、Apdex FAQ に簡単な指標が提示されています。 この記事の下部の画像を見る限りでは、一般的には 0.9 以上をキープするのがよさそうです。
ちなみに、New Relic のデフォルト設定では、5 時間連続で Apdex が 0.7 を下回るとアラートが発生するようになっています。
T はどうやって選ぶの?
Apdex Measurement で紹介されている動画によると、実際のサービスのレスポンス時間の平均値に近い値をとるとよいそうです。
当たり前ですが、同じアプリケーションでも T の値によって Apdex スコアが変化します。
- T を必要以上にさげる => 必要のないのにアラートが発生する(false-positive)
- T を必要以上にあげる => 必要なのにアラートが発生しない(false-negative)
という状態になるので、T の値を決定することは重要です。
なお、New Relic のデフォルトでは 500 [ms] となっています。
各リクエストの個数でどうやって Apdex は変化するの?
各値の変化による Apdex の値の変化は以下のブログ記事の下の方の図にあります。
New Relic の Apdex 値 "0.9 [500]" の "[500]" って何?
T の値です。
Apdex は T の値によって変化するので T の値を明示しないと意味のある値になりません。 仕様 にも明記されています。
なんで 2T とか 8T じゃなくて 4T なの?
仕様策定者の書いた論文によると、
- ユーザービリティの研究でレスポンス時間の満足度に関する論文がいくつかある
- それぞれの論文で「満足レスポンス時間」:「許容レスポンス時間」は 1:3、1:4、1:5 だった
- 間をとって 1:4 にした
ということだそうです。