集積体の結果を調べるときは、通常、上位結果の数行だけに注目します。上位の値以外に関連付けられたキーや値は、あまり重要ではありません。また、キーと値の両方を削除して、集積体の結果全体を破棄したい場合もあります。DTrace の trunc() 関数は、こうした状況で使用します。
trunc() のパラメータとして指定できるのは、集積体と切り捨て値 (オプション) です。trunc() で切り捨て値を省略すると、集積体全体で集積体値と集積体キーとの両方が破棄されます。trunc() で切り捨て値 n を指定した場合は、上位 n 個の値に関連付けられている集積体値と集積体キー以外の値とキーを破棄します。つまり、trunc(@foo) では集積体全体が破棄されるのに対し、trunc(@foo, 10) では、foo という名前の集積体値の上位 10 個が保持され、それ以外の値が切り捨てられることになります。切り捨て値として 0 を指定した場合も、集積体全体が破棄されます。
上位 n 個の値ではなく下位 n 個の値を参照したい場合は、trunc() に負の切り捨て値を指定します。たとえば、trunc(@foo, -10) では、foo という名前の集積体値の下位 10 個が保持され、それ以外の値が切り捨てられます。
以下の例は、10 秒間での上位 10 個のシステム呼び出しアプリケーションについて秒当たりのシステムコールレートが出力だけされるように、先ほどのシステムコールの例を拡張したものです。
#pragma D option quiet BEGIN { last = timestamp; } syscall:::entry { @func[execname] = count(); } tick-10sec { trunc(@func, 10); normalize(@func, (timestamp - last) / 1000000000); printa(@func); clear(@func); last = timestamp; }
以下は、負荷の少ないラップトップでこのスクリプトを実行したときの出力例です。
FvwmAuto 7 telnet 13 ping 14 dtrace 27 xclock 34 MozillaFirebird- 63 xterm 133 fvwm2 146 acroread 168 Xsun 616 telnet 4 FvwmAuto 5 ping 14 dtrace 27 xclock 35 fvwm2 69 xterm 70 acroread 164 MozillaFirebird- 491 Xsun 1287 |