Comment puis-je profiler un script shell?

10

J'ai plusieurs programmes que j'exécute dans un script shell:

./myprogram1
./myprogram2
...

Je sais que je peux profiler chaque programme individuel en éditant le code source, mais je voulais savoir s'il y avait un moyen de mesurer le temps total exécuté en profilant le script lui-même. Existe-t-il un programme de minuterie que je peux utiliser à cette fin? Si oui, quelle est sa précision?

Paul
la source
peut-être que cela peut être un profilage utile - Comment profiler un script shell bash? - Stack Overflow -> stackoverflow.com/questions/5014823/…
Mohammad Efazati

Réponses:

10

Commencez par utiliser le temps selon la suggestion de Jon Lin:

$ time ls test
test

real    0m0.004s
user    0m0.002s
sys     0m0.002s

Vous ne dites pas sur quel unix vos scripts fonctionnent, mais strace sous linux, truss sous Solaris / AIX, et je pense que tusc sur hp-ux vous permet d'en apprendre beaucoup sur ce que fait un processus. J'aime l'option -c de strace pour obtenir un joli résumé:

]$ strace -c ls
test
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 89.19    0.000998         998         1           execve
 10.81    0.000121         121         1           write
  0.00    0.000000           0        12           read
  0.00    0.000000           0        93        79 open
  0.00    0.000000           0        16           close
  0.00    0.000000           0         2         1 access
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         4           munmap
  0.00    0.000000           0         1           uname
  0.00    0.000000           0         6           mprotect
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0        30           mmap2
  0.00    0.000000           0         8         7 stat64
  0.00    0.000000           0        13           fstat64
  0.00    0.000000           0         2           getdents64
  0.00    0.000000           0         1           fcntl64
  0.00    0.000000           0         1           futex
  0.00    0.000000           0         1           set_thread_area
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
  0.00    0.000000           0         1           socket
  0.00    0.000000           0         1         1 connect
------ ----------- ----------- --------- --------- ----------------
100.00    0.001119                   205        88 total

Notez également que la connexion de ces programmes de type traçage peut ralentir quelque peu le programme.

Davey
la source
En fait, j'utilise principalement Redhat, mais je commence à utiliser Debian (ubuntu) plus souvent ces jours-ci également.
Paul
4

Découvrez la timecommande . Vous pouvez l'utiliser pour mesurer le temps nécessaire à l'exécution ainsi que d'autres informations utiles comme l'endroit où le temps est passé.

Jon Lin
la source
2

Ce n'est pas exactement du profilage, mais vous pouvez suivre votre script pendant son exécution. Mettez set -xvavant la section que vous souhaitez tracer et set +xvaprès la section. set -xactive xtrace, qui affichera chaque ligne qui s'exécute. set -vactive le mode verbeux, qui montrera également les lignes qui peuvent avoir un effet, mais qui ne sont pas exécutées, comme l'affectation des variables.

Vous pouvez également horodater votre trace. Vous avez besoin d'un émulateur de terminal qui peut horodater chaque ligne; le seul que je connaisse est RealTerm , qui est un programme Windows, mais il fonctionnera avec Wine. Vous pourriez également être en mesure d'utiliser grabserial, même si je ne l'ai pas essayé sauf avec de vrais ports série. Vous pouvez découvrir quel périphérique série votre shell utilise en exécutant ps -p $$(si ce n'est pas le cas, utilisez manpour savoir comment inclure la colonne TTY dans votre pssortie).

Voir également Outils de profilage des performances pour les scripts shell sur Stack Overflow.

Shawn J. Goff
la source
2

time pour plusieurs itérations

Profilage en exécutant plusieurs fois la même commande

time (for ((n=0;n<10;n++)); do echo "scale=1000; 4*a(1)" | bc -l; done)

echo "scale=1000; 4*a(1)" | bc -lcalcule pi et time (...)garantit que la forboucle s'exécute comme une seule commande.

Anton Tarasenko
la source
1

Depuis que je me suis retrouvé ici au moins deux fois maintenant, j'ai implémenté une solution:

https://github.com/walles/shellprof

Il exécute votre script, horloge de manière transparente toutes les lignes imprimées et à la fin imprime une liste des 10 premières lignes qui étaient à l'écran le plus longtemps:

~/s/shellprof (master|✔) $ ./shellprof ./testcase.sh
quick
slow
quick

Timings for printed lines:
1.01s: slow
0.00s: <<<PROGRAM START>>>
0.00s: quick
0.00s: quick
~/s/shellprof (master|✔) $
Johan Walles
la source