3.5.7. 統計集計の計算
統計集計は、新規データを素早くかつ大量に累積 (集計ストリーム統計情報のみを保存) することが重要な場合に、数的値の統計情報を収集するために使用されます。統計集計はグローバル変数またはアレイ内の要素として使用できます。
統計集計に値を追加するには、演算子
<<< value
を使用します。
例3.19 stat-aggregates.stp
global reads probe vfs.read { reads[execname()] <<< count }
例3.19「stat-aggregates.stp」 では、演算子
<<< count
が、reads
アレイ内の対応する execname()
の関連する値に count
が返した数字を 保存 します。これらの値は 保存される のであって、各一意の鍵の関連する値に追加されたり、現行の関連する値に置き換わるものではありません。各一意の鍵 (execname()
) に複数の関連する値があり、ハンドラーが実行するプローブで累積していると考えればよいでしょう。
注記
統計集計が収集したデータを抽出するには、構文書式
@extractor(variable/array index expression)
を使用します。extractor
は、以下のいずれかの整数抽出になります。
- count
- 変数やアレイのインデックス式に保存されたすべての値の数を返します。例3.19「stat-aggregates.stp」 のサンプルプローブでは、
@count(writes[execname()])
の式は、アレイwrites
の各一意の鍵に 保存されている値の数 を返します。 - sum
- 変数やアレイのインデックス式に保存されたすべての値の合計を返します。例3.19「stat-aggregates.stp」 のサンプルプローブでは、
@sum(writes[execname()])
の式は、アレイwrites
の各一意の鍵に 保存されている値すべての合計 を返します。 - min
- 変数やアレイのインデックス式に保存されたすべての値で最も小さいものを返します。
- max
- 変数やアレイのインデックス式に保存されたすべての値で最も大きいものを返します。
- avg
- 変数やアレイのインデックス式に保存されたすべての値の平均を返します。
統計集計を使用する際には、複数のインデックス式 (最大 5 つ) を使用するアレイコンストラクトを構築することもできます。これは、プローブ中に追加のコンテキスト情報を捕捉する際に便利です。以下に例を示します。
例3.20 複数のアレイインデックス
global reads probe vfs.read { reads[execname(),pid()] <<< 1 } probe timer.s(3) { foreach([var1,var2] in reads) printf("%s (%d) : %d \n", var1, var2, @count(reads[var1,var2])) }
例3.20「複数のアレイインデックス」 では、最初のプローブで各プロセスが実行した VFS read の数を追跡します。この例が他と異なる点は、このアレイは実行された read をプロセス名 と それに対応するプロセス ID の両方に関連付けしている点です。
例3.20「複数のアレイインデックス」 の 2 つ目のプローブは、アレイ
reads
が収集した情報を処理してプリントする方法を示しています。foreach
ステートメントは、最初のプローブのアレイ reads
の最初のインスタンスに含まれる変数 (var1
および var2
) と同じ数を使用している点に注意してください。