Gibt es so etwas wie "Zeit", die auch E / A und CPU aufzeichnet?

18

Ich kann die Laufzeit eines Prozesses ziemlich schnell überwachen mit time:

x@y ~ $ time foo

real        0m14.299s
user        0m4.770s
sys         0m0.440s

Gibt es eine Möglichkeit, die gleichen Daten für die E / A- und CPU-Auslastung eines Arguments zu erhalten, das in STDOUT aufgezeichnet wurde? timeIdeal wäre ein einfacher Befehl oder ein Dienstprogramm wie :

x@y ~ $ stats foo

wallclock runtime     0m14.299s
I/O reads             290,420 KB
I/O writes            239,429 KB
peak CPU usage        18.62%
mean CPU usage        1.44%
# etc.
John Feminella
quelle

Antworten:

25

Schauen Sie sich die Zeitmanpage auf Ihrem System an, einige Implementierungen haben Formatoptionen, die E / A-, CPU- und Speicherstatistiken (-f) enthalten.

Zum Beispiel zeigt GNU timemit -valle verfügbaren Informationen an (hier unter Linux):

/usr/bin/time -v ls

Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 3664
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 273
Voluntary context switches: 2
Involuntary context switches: 2
Swaps: 0
File system inputs: 0
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0

Auf BSDs, verwenden -lstatt.

Beachten Sie, dass dies das eigentliche /usr/bin/timeProgramm ist und nicht das Schlüsselwort, bashmit dem Sie einige Shells aufrufen time pipeline.

MaQleod
quelle
4
zshDas timeSchlüsselwort von kann auch konfiguriert werden (mit $TIMEFMT), um diese Informationen bereitzustellen.
Stéphane Chazelas
1
Genau das wollte ich. Perfekt! Vielen Dank auch an die Redakteure dieses Beitrags, die klargestellt haben, dass Sie ihn ausführen müssen, command time -v ...da er bashentführt wird time.
John Feminella
4

Der Befehl stracekann nützlich sein. Sie können den Trace auf die Anzahl -coder eine Teilmenge von Systemaufrufen beschränken.

-e trace=set
      Trace  only  the  specified set of system calls.  The -c option is
      useful for determining which  system  calls  might  be  useful  to
      trace.   For  example,  trace=open,close,read,write  means to only
      trace those four system calls.  Be careful when making  inferences
      about  the  user/kernel  boundary if only a subset of system calls
      are being monitored.  The default is trace=all.

In dieser Antwort verwende ich es, um die Anzahl der Systemaufrufe zu zählen. Ich weiß nicht, ob Ihnen irgendetwas eine zusammenfassende Aufschlüsselung des Durchsatzes liefert, aber strace kann die Zahlen für so etwas wie eine Zusammenfassung liefern awk.

X Tian
quelle
stracekann die Dinge erheblich verlangsamen, daher ist es nützlich, die relativen Zeiten verschiedener Systemaufrufe zu messen, aber ich würde es nicht als Allzweck-Timer verwenden. perfist viel schneller / weniger aufdringlich, wenn Sie mit Abtastfrequenzoptionen spielen.
Marcin