Truncating aggregations
When looking at aggregation results, you often care only about the top several
results. The keys and values associated with anything other than the highest values
are not interesting. You might also wish to discard an entire aggregation result,
removing both keys and values. The DTrace trunc() function is used for both
of these situations.
The parameters to trunc() are an aggregation and an optional truncation value. Without
the truncation value, trunc() discards both aggregation values and aggregation keys for the
entire aggregation. When a truncation value n is present, trunc() discards aggregation values
and keys except for those values and keys associated with the highest
n values. That is, trunc(@foo, 10) truncates the aggregation named foo after the top
ten values, where trunc(@foo) discards the entire aggregation. The entire aggregation is also
discarded if 0 is specified as the truncation value.
To see the bottom n values instead of the top n, specify a
negative truncation value to trunc(). For example, trunc(@foo, -10) truncates the aggregation named foo
after the bottom ten values.
The following example augments the system call example to only display the per-second
system call rates of the top ten system-calling applications in a ten-second period:
#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;
}
The following example shows output from running the above script on a lightly
loaded laptop:
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