Bei der Betrachtung von Aggregatergebnissen interessieren häufig nur die oberen Resultate. Die zu allen anderen außer den höchsten Werten gehörenden Schlüssel und Werte sind irrelevant. Auch kann es nützlich sein, durch Entfernen der Schlüssel und der Werte ein ganzes Aggregatergebnis zu löschen. Zu beiden Zwecken dient die DTrace-Funktion trunc().
Die Parameter für trunc() sind ein Aggregat und ein optionaler Kürzungswert. Ohne Kürzungswert verwirft trunc() sowohl die Aggregatwerte als auch die Aggregatschlüssel für das gesamte Aggregat. Ist ein Kürzungswert n vorhanden, löscht trunc() die Aggregatwerte und -schlüssel mit Ausnahme der Werte und Schlüssel, die zu den n höchsten Werten gehören. Das heißt, dass trunc(@foo, 10) das Aggregat namens foo nach den zehn höchsten Werten abschneidet, während trunc(@foo) das gesamte Aggregat löscht. Es wird auch dann das gesamte Aggregat gelöscht, wenn als Kürzungswert 0 angegeben wurde.
Um anstelle der n oberen die n unteren Werte anzuzeigen, übergeben Sie der Funktion trunc() einen negativen Kürzungswert. So schneidet beispielsweise trunc(@foo, -10) das Aggregat foo hinter den zehn niedrigsten Werten ab.
Erweitern wir nun das Systemaufruf-Beispiel so, dass über einen Zeitraum von zehn Sekunden die Häufigkeit der Systemaufrufe pro Sekunde für die zehn oberen aufrufenden Anwendungen angezeigt wird:
#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; }
Das nächste Beispiel zeigt die Ausgabe des obigen Skripts bei Ausführung auf einem Laptop mit geringer Systemlast:
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 |