パフォーマンス関連の問題を調査するときは、通常、個々のデータポイントではなく、集積データを調べるほうが効果的です。DTrace には、いくつかの組み込みの集積関数が用意されています。データ集合のサブセットに集積関数を適用し、これらのサブセットの分析結果に再度集積関数を適用すると、データ集合全体に集積関数を適用した場合と同じ結果になります。
DTrace 機能は、集積のため、データ項目のランニングカウントを格納します。集積関数は、現在の中間結果と、関数の適用先の新規要素のみを格納します。中間結果は、CPU 単位で割り当てられます。この割り当て方式では、ロックは必要ありません。したがって、実装は本質的にスケーラブルです。
DTrace 集積体の一般構文は、次のとおりです。
@name[ keys ] = aggfunc( args );
この一般構文では、変数は次のように定義されています。
集積体の名前。先頭に @ 文字が付きます。
D 式をコンマで区切って指定します。
DTrace 集積関数のいずれか。
その集積関数に対応する引数をコンマで区切って指定します。
関数名 |
引数 |
結果 |
---|---|---|
count |
なし |
count 関数が呼び出される回数。 |
sum |
スカラー式 |
指定された式の合計値。 |
avg |
スカラー式 |
指定された式の算術平均。 |
min |
スカラー式 |
指定された式のうちもっとも小さい値。 |
max |
スカラー式 |
指定された式のうちもっとも大きい値。 |
lquantize |
スカラー式、下限値、上限値、ステップ値 |
指定された式の値から成る、指定された範囲の線形度数分布。この集積関数は、指定された式より小さい、最大バケット内の値を増分します。 |
quantize |
スカラー式 |
指定された式の値の二乗度数分布。この集積関数は、指定された式より小さい、2 のべき乗の最大バケット内の値を増分します。 |
次に示すのは、count 集積関数を使って、プロセスごとに write(2) システムコールの数をカウントする例です。この集積体は、dtrace コマンドが終了するまで、一切のデータを出力しません。出力される内容は、dtrace コマンドがアクティブであったときに収集されたデータの概要です。
# cat writes.d #!/usr/sbin/dtrace -s syscall::write:entry] { @numWrites[execname] = count(); } # ./writes.d dtrace: script 'writes.d' matched 1 probe ^C dtrace 1 date 1 bash 3 grep 20 file 197 ls 201 |