平均とパーセンタイルを理解する:パフォーマンス指標の初心者向けガイド
パフォーマンスの監視は、アプリケーションを正常に実行するための重要な部分です。 何かのパフォーマンスを伝える最も基本的な方法の 1 つ それは、それが発生するたびに継続時間を測定し、そこから統計を抽出することです。
平均
値の集合の平均値は、何かの動作がどの程度良いか悪いかを確認する良い出発点となります。これは、考慮中のすべての値を合計し、出現回数で割ることによって計算されます。
Ruby では、平均応答時間の計算は次のようになります。
注意 :この例では、除算時により正確な結果を得るために、合計期間の値を Float にキャストしています。それ以外の場合、Ruby は最も近い整数に切り捨てて 4 を返します。 代わりに。
もう 1 つの有用な統計は中央値です。似ているように見えますが、値の集合の平均と中央値には違いがあります。
中央値は、セットの上半分とセットの下半分を分ける値です。
奇数の値を含むデータセットの場合、最初に値を並べ替えてから中央の数値を選択することで中央値を取得します。偶数の値を含むセットの場合、それらを並べ替えると、中央値は中央の 2 つの数値の平均になります。
この統計は、データに大きな偏りやロングテールがあるかどうかを確認する良い方法です。
上記の期間の平均は 335.83 になります。 2000ms という単一の外れ値が原因です。中央値はわずか 3.5 、スキューがあることを示します。
データセットの平均と中央値の両方を計算することで、大きな外れ値やロングテールがあるかどうかを把握できます。
平均値の問題
平均値と中央値はパフォーマンスの優れた指標ですが、すべてを伝えるものではありません。ウェブページを 10 回リクエストすると、平均は非常に低くなる可能性がありますが、1 つ以上のリクエストは完了するまでに非常に長い時間がかかる可能性があります。
以下の画像は、AppSignal の特定のアクションの 99 パーセンタイル (青) と 90 パーセンタイル (緑) および平均 (赤) を示しています。 99 番目と 90 番目は平均からかなり離れており、いくつかのスパイクがあることがわかります。これは、平均的な顧客は良好なエクスペリエンスを提供している一方で、ページが表示されるまでにほぼ 2 倍の時間待たなければならないユーザーがいることを意味します。理想的には、これらすべての値をできる限り相互に近づけて、すべてのユーザーにとってより一貫したエクスペリエンスを提供したいと考えます。

たとえば、次の期間セットでは、10 人の顧客が 100 ミリ秒から 1 秒までの期間のページをリクエストするとします。
これにより、平均はわずか 190ms になります。 一方、あるユーザーは応答時間が 1 秒という非常に悪い経験をしました。平均値だけを追跡していると、ウェブサイトのパフォーマンスが優れていると思われがちですが、実際にはユーザーがひどい経験をすることがあります。
上の例は 10 件のリクエストのみを対象としていますが、1 日に 1,000 件のリクエストがあった場合、そのうちの 100 人のユーザーがひどい経験をしたことになると想像してください。
パーセンタイル
値の分布をよりよく理解するために、パーセンタイルを使用します。パーセンタイルは中央値に似ています。これは、セットの半分がその数値より下にあり、残りの半分が上にあるデータセット内の点を示す数値です。パーセンタイルは、20 パーセンタイルがデータセット内の数値の 20% がその数値を下回ることを意味するという意味で似ています。
次の (ソートされた) セットがあるとします:
20 パーセンタイルを知りたい場合は、次の方法で計算できます。セットには 10 個の値があります。必要な値は位置 1 (20.0 / 100 * 10 - 1) にあります。 ) 配列はゼロから始まるためです。この配列には偶数の項目が含まれているため、インデックス (2) 間の平均を計算する必要があります。 ) およびインデックス + 1 (3) )。これにより、値は 150 になります。 20 パーセンタイルの場合。
非常に単純な Ruby 実装は次のようになります。
この percentile 関数は median と非常に似ています。 計算、そして実際には median 50th と同じです パーセンタイル。
AppSignal は上記の統計を使用して、アプリケーションのパフォーマンス メトリクスを生成します。私たちは平均/平均だけに依存するのではなく、90 パーセンタイルと 95 パーセンタイルを計算して外れ値を示し、リクエストの分布をより正確に把握します。詳細については、パフォーマンス ツアー ページをご覧ください。
奇妙なもの
パーセンタイルと平均の計算方法により、たとえば次のデータセットの場合、90 パーセンタイルが平均を下回る場合があります。
これにより、mean が得られます。 182.73 の 、90 パーセンタイルはちょうど 1 .
指標収集システムが 90 パーセンタイルと平均値のみを表示する場合でも、90 パーセンタイルが平均を下回ると、データセットのどこかに大きな外れ値があると推測できます。
👋 この記事を気に入っていただけた場合は、Ruby (on Rails) のパフォーマンスについて他にもたくさん書いています。Ruby のパフォーマンス監視チェックリストをチェックしてください。
この投稿はほぼ 100% 完了しています
今のところは以上です!別の投稿では、Quantiles を使用してすべての顧客リクエストのパーセンタイルを効率的に保存および計算する方法について説明する予定です。統計と APM、エラー追跡、パフォーマンスの監視についてご質問やご意見がございましたら、Twitter @AppSignal または電子メールでお問い合わせください。
ロバート・ビークマン
ロバートは共同創設者として、私たちの最初のコミットを書きました。彼は私たちのサポートのロールモデルでもあり、コードの細かい詳細についてすべて知っています。旅行と写真 (同時に)。
Robert Beekman によるすべての記事
-
Rubyのselectメソッドの使い方を実例つきで徹底解説
Rubyのselectメソッドを使うと、オブジェクトの配列を簡単にフィルタリングできます。 たとえば、リストの中から偶数をすべて見つけたい場合などに便利です。 selectを使わずに書くと、次のようになります: even_numbers = [] [1,2,3,4,5,6].each do |n| if n.even? even_numbers << n end end even_numbers こんなにシンプルな処理なのに、かなり長いコードになってしまいますね! それでは、selectの使い方を学んでいきましょう。 selectメソッドの基本例 selectを使うには
-
RuboCopで実現するRubyコードのリントと自動フォーマット徹底ガイド
リンティング(Lint)とは、ソースコードに含まれるプログラム上の誤りやスタイル違反を自動的に検出する仕組みです。このチェックは「リンター」と呼ばれる静的コード解析ツールによって行われます。一方、コードフォーマッターは、あらかじめ設定されたルールセットにソースコードを厳密に準拠させることに特化したツールです。一般的にリンターは違反を報告するだけで、実際の修正はプログラマーの手に委ねられます。それに対してコードフォーマッターは、ルールを直接ソースコードに適用し、フォーマットのミスを自動的に修正してくれます。 プロジェクトで一貫性のあるコードスタイルを実現するには、通常リンティング用とフォーマッ