Y a-t-il quelque chose comme «temps» qui enregistre également les E / S et le processeur?

18

Je peux surveiller assez rapidement le temps d'exécution d'un processus avec time:

x@y ~ $ time foo

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

Existe-t-il un moyen d'obtenir les mêmes données pour les E / S et l'utilisation du processeur d'un argument, enregistrées dans STDOUT? Une simple commande ou un utilitaire comme timeserait idéal, où je passe juste l'argument de la chose que je veux exécuter:

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
la source

Réponses:

25

regardez la page de manuel de temps sur votre système, certaines implémentations ont des options de format pour inclure les statistiques d'E / S, CPU et mémoire (-f).

Par exemple, GNU time, avec -vaffichera toutes les informations disponibles (ici sur 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

On BSDs, utilisez à la -lplace.

Notez que c'est le /usr/bin/timeprogramme réel , pas le mot-clé que certains shells aiment bashfournir avec lequel vous invoquez time pipeline.

MaQleod
la source
4
zshLe timemot-clé de peut également être configuré (avec $TIMEFMT) pour fournir ces informations.
Stéphane Chazelas
1
C'est exactement ce que je voulais. Parfait! Merci également aux éditeurs de cet article qui ont précisé que vous devrez l'exécuter command time -v ...car il bashs'agit d'un détournement time.
John Feminella
4

La commande stracepeut être utile, vous pouvez limiter la trace au nombre -cou à un sous-ensemble d'appels système,

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

Dans cette réponse , je l'utilise pour compter le nombre d'appels système. Je ne sais pas si quelque chose vous donnera une ventilation sommaire du débit, mais strace peut produire les chiffres pour quelque chose comme awkrésumer.

X Tian
la source
stracepeut ralentir considérablement les choses, il est donc utile de mesurer les temps relatifs des différents appels système, mais je ne l'utiliserais pas comme une minuterie à usage général. perfest beaucoup plus rapide / moins intrusif, si vous jouez avec des options de fréquence d'échantillonnage.
Marcin