Czy istnieje coś takiego jak „czas”, który rejestruje również operacje we / wy i procesor?

18

Mogę dość szybko monitorować czas przebiegu procesu za pomocą time:

x@y ~ $ time foo

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

Czy istnieje sposób, aby uzyskać te same dane dla operacji we / wy i wykorzystania procesora przez argument zapisane w STDOUT? Idealne timebyłoby proste polecenie lub narzędzie , w którym przekazuję argument dotyczący rzeczy, którą chcę uruchomić:

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
źródło

Odpowiedzi:

25

spójrz na stronę podręcznika czasowego w twoim systemie, niektóre implementacje mają opcje formatowania obejmujące statystyki I / O, CPU i pamięci (-f).

Na przykład GNU time, z -vpokaże wszystkie dostępne informacje (tutaj w systemie 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

Włącz BSDs, użyj -lzamiast tego.

Zauważ, że jest to rzeczywisty /usr/bin/timeprogram, a nie słowo kluczowe, które zapewniają niektóre powłoki, bashktóre wywołujesz time pipeline.

MaQleod
źródło
4
zshSłowo timekluczowe można również skonfigurować (za pomocą $TIMEFMT) w celu zapewnienia tych informacji.
Stéphane Chazelas
1
Właśnie tego chciałem. Doskonały! Dziękuję również redaktorom tego postu, którzy wyjaśnili, że będziesz musiał go uruchomić, command time -v ...ponieważ bashjest to porwanie time.
John Feminella
4

Polecenie stracemoże być przydatne, możesz ograniczyć śledzenie tylko do liczby -club podzbioru wywołań systemowych,

-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.

W tej odpowiedzi używam go do zliczania liczby wywołań systemowych. Nie wiem, czy cokolwiek da ci podsumowanie podziału przepustowości, jednak strace może wygenerować dane liczbowe dla czegoś takiego jak awkpodsumowanie.

X Tian
źródło
stracemoże znacznie spowolnić, dlatego warto mierzyć względne czasy różnych wywołań systemowych, ale nie używałbym go jako timera ogólnego przeznaczenia. perfjest znacznie szybszy / mniej ingerujący, jeśli grasz z opcjami częstotliwości próbkowania.
Marcin