Як я можу профілювати сценарій оболонки?


10

У мене є кілька програм, які я виконую в сценарії оболонки:

./myprogram1
./myprogram2
...

Я знаю, що я можу профайлювати кожну окрему програму шляхом редагування вихідного коду, але я хотів знати, чи є спосіб я міряти загальний час, виконаний шляхом профілювання самого сценарію. Чи є програма таймера, яку я можу використовувати для цієї мети? Якщо так, то наскільки точним є його вимірювання?


можливо, це буде корисним профілюванням - Як профайлювати сценарій bash shell? - Переповнення стека -> stackoverflow.com/questions/5014823 / ...
Мохаммад Efazati

Відповіді:


10

Почніть з використання часу відповідно до пропозиції Джона Ліна:

$ time ls test
test

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

Ви не говорите про те, на чому виконуються ваші сценарії Unix, але напруга в Linux, ферма на Solaris / AIX, і я думаю, що tusc на hp-ux дозволяє вам дізнатися багато про те, що робить процес. Мені подобається -c-варіант strace, щоб отримати хороший підсумок:

]$ 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

Також зауважте, що приєднання цих програм відстеження може дещо уповільнити програму.


Насправді я в основному використовую Redhat, але я починаю частіше використовувати Debian (ubuntu) і в наші дні.
Пол

4

Перевірте timeкоманду . Ви можете використовувати його для вимірювання часу, необхідного для виконання разом з іншою корисною інформацією, наприклад, де витрачається час.


2

Це не зовсім профілювання, але ви можете простежити ваш сценарій у процесі його виконання. Поставте set -xvперед розділом, який ви хочете простежити, і set +xvпісля розділу. set -xувімкнює xtrace, який покаже кожен рядок, який виконується. set -vвмикає багатослівний режим, який також показуватиме рядки, які можуть мати ефект, але не виконуються, наприклад присвоєння змінної.

Ви також можете позначити свій слід. Вам потрібен емулятор терміналу, який може позначити часові позначки кожного рядка; Єдине, про що я знаю, це RealTerm , це програма Windows, але вона буде працювати з Wine. Ви також можете використовувати grabserial, хоча я не пробував цього, окрім реальних серійних портів. Ви можете дізнатися, який серійний пристрій використовує ваша оболонка, запустивши ps -p $$(якщо цього немає, скористайтеся, manщоб дізнатися, як включити стовпець TTY у свій psвихід).

Також див. Інструменти профілювання продуктивності для скриптів оболонок на переповнення стека.


2

time для декількох ітерацій

Профілювання, виконавши одну і ту ж команду кілька разів

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

Де echo "scale=1000; 4*a(1)" | bc -lобчислює pi і time (...)забезпечує forцикл, що працює як одна команда.


1

Оскільки я щонайменше двічі опинився тут, я реалізував рішення:

https://github.com/walles/shellprof

Він запускає ваш сценарій, прозоро синхронізує всі надруковані рядки, а в кінці друкує список 10 найкращих рядків, які були найдовшими на екрані:

~/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|✔) $
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.