dtraceの集積体について

dtraceの集積体について調べてみたので、簡単にまとめてみました。

dtraceの集積体とは集積関数の実行結果を格納するためのオブジェクトです。
ちょうどハッシュに似た表現形式をとります。

集積関数とは、「データのサブセットに集積関数を適用し、その結果に再度集積関数を適用した結果」と、「データ全体に集積関数を適用した結果」が等しくなる関数のことです。

例えば、データの集合{3,4,6,7,2,1}があったとします。
このとき、最大値を求めるmaxを集合全体に適用すると、当然結果は7になります。

で、この集合を2つずつの要素に分けた3つのサブセット({3,4},{6,7},{2,1})に分解した結果それぞれにmaxを適用すると...

max({3,4}) = 4
max({6,7}) = 7
max({2,1}) = 2

となります。これが「データのサブセットに集積関数を適用し」になります。
そして、この結果の集合{4,7,2}に対して再度maxを適用すると結果が7になり、集合全体に適用した結果と等しくなります。これが「その結果に再度集積関数を適用」になります。

集積関数には他にもmin,max,avg,quantizeなどがあります。
DスクリプトNetBSDでの使用例は以下のようになります。

fbt:netbsd:sys_write:entry
{
	self->ts = timestamp;
}

fbt:netbsd:sys_write:return
/self->ts/
{
	@time[execname] = avg(timestamp - self->ts);
	self->ts = 0;
}

これは、sys_writeの実行時間の平均を求めるスクリプトになります。
「@time[execname]」というのが集積体になります。
これはexecname、つまり実行プロセスごとにsys_writeの実行時間の平均を格納します。
スクリプトをCtrl-Cで中断すると以下のような表示をします。

# fg
dtrace -s writetime.d
^C

  tcsh                                                          14392
  sshd                                                          25188
  dtrace                                                        25899
  cat                                                           26828
# 

確かにsys_writeを実行したプロセスごとに実行時間が表示されています。
これは便利そうだ・・・。