Wie berechnet und gruppiert man die Zeitunterschiede bestimmter Systemaufrufe beim Ausführen von strace?

1184
kenorb

Ich plane einige Web-Performance-Tests (um zu sehen, wie viel Zeit für jede Datei aufgewendet wurde), aber es könnte für jede Anwendung nützlich sein.

Ich kenne die Existenz genau und weiß, wie verschiedene Leistungsanwendungen verwendet werden. Daher bin ich nur an einer Lösung für strace interessiert.

Grundsätzlich möchte ich die Zeitausführungsunterschiede meiner gefilterten Systemaufrufe berechnen und sie dann gruppieren, sortieren und die Zusammenfassung erstellen (ähnlich der Option -C).

Einige Anwendungsbeispiele:

$ strace -ttt -s1500 -o/dev/stdout -e trace=open,access sleep 1 | awk '' $ strace -ttt -s1500 -s/dev/stdout -e trace=access drush ev '' | awk '' (some example output) 1344416787.291395 execve("/bin/sleep", 1344416787.291796 brk(0) 1344416787.291879 access("/etc/ld.so.nohwcap", 1344416787.291960 mmap(NULL, 1344416787.292026 access("/etc/ld.so.preload", 1344416787.292089 open("/etc/ld.so.cache", ... 1344416787.294428 nanosleep(' 0.00101089 

Hinweis: In strace können Sie ein anderes Format wie -t, -tt oder -ttt verwenden (Sie können jedes verwenden, das einfacher zu analysieren ist).

Dann generieren Sie die Liste wie (zB mit sort, uniq usw. ohne Header):

seconds syscall ------ ----------- 0.001580 close(2) 0.000132 close(1) 0.000032 exit_group(0) 0.000022 access("/etc/ld.so.preload", 0.000012 access("/etc/ld.so.cache", 

Gruppieren Sie es nicht nur nach dem Namen von syscall, sondern nach der gesamten Phrase ($ 2).

Dies sollte so einfach wie möglich sein. Wenn es einen One-Liner gibt, würde ich es gerne sehen. Vielen Dank.

PS Wenn Sie denken, dass es Ihnen sinnlos ist, ignorieren Sie es bitte.

-

Verwandte Themen (die für einige Ideen nützlich sein könnten):

Wie kann man zwei Zahlen aus zwei Strings extrahieren und die Differenz in Bash berechnen?

http://www.unix.com/shell-programming-scripting/121053-sum-value-selected-lines-script-awk-perl.html

http://unstableme.blogspot.ch/2009/12/sum-numbers-in-each-row-awk.html

http://www.unix.com/shell-programming-scripting/157047-awk-compare-previous-value-current.html

2

1 Antwort auf die Frage

2
Yasushi Shoji

Sie können es so machen:

$ strace -ttt ls 2>&1 1>&2- | awk '{ if (NR < 2) else } END '| sort -n 0.000874 access("/etc/ld.so.preload", 0.000944 open("/etc/ld.so.cache", 0.001242 open("/lib/x86_64-linux-gnu/libselinux.so.1", 0.001490 mprotect(0x7f0166a2b000, 0.001543 mmap(0x7f0166c2a000, 

Es gibt ein viel besseres Werkzeug, wenn Sie Systemaufrufe unter Linux erfassen möchten:

BTW, $ 2 enthält nicht alle Argumente des Systemaufrufs, die Sie 0.073917 mmap(NULL,in Ihrer Ausgabe sehen