Есть ли что-то вроде `time`, которое также записывает ввод / вывод и процессор?

18

Я могу довольно быстро контролировать время выполнения процесса с помощью time:

x@y ~ $ time foo

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

Есть ли способ получить те же данные для ввода-вывода и использования ЦП аргумента, записанного в STDOUT? timeИдеальной будет простая команда или утилита , где я просто передаю аргумент того, что хочу запустить:

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.
Джон Феминелла
источник

Ответы:

25

Посмотрите man-страницу времени в вашей системе, в некоторых реализациях есть опции формата для включения статистики ввода-вывода, процессора и памяти (-f).

Например, GNU time, с -vпокажет всю доступную информацию (здесь, в 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

Вкл BSDs, используйте -lвместо этого.

Обратите внимание, что это настоящая /usr/bin/timeпрограмма, а не ключевое слово, которое, как некоторые оболочки, bashпредоставляют, которое вы вызываете time pipeline.

MaQleod
источник
4
zshtimeКлючевое слово 's также может быть настроено (с $TIMEFMT) для предоставления этой информации.
Стефан Шазелас
1
Это именно то, что я хотел. Отлично! Кроме того, спасибо редакторам этого поста, которые пояснили, что вам нужно будет запустить его, command time -v ...так как bashэто угон time.
Джон Феминелла
4

Команда straceможет быть полезна, вы можете ограничить трассировку только количеством -cили подмножеством системных вызовов,

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

В этом ответе я использую его для подсчета количества системных вызовов. Я не знаю, даст ли вам что-то общее представление о пропускной способности, однако strace может дать цифры для awkсуммирования.

X Тянь
источник
straceможет значительно замедлить процесс, поэтому полезно измерять относительное время разных системных вызовов, но я бы не стал использовать его как таймер общего назначения. perfгораздо быстрее / менее навязчиво, если вы играете с опциями частоты дискретизации.
Марцин