쉘 스크립트를 어떻게 프로파일 링 할 수 있습니까?


10

쉘 스크립트에서 실행중인 여러 프로그램이 있습니다.

./myprogram1
./myprogram2
...

소스 코드를 편집하여 각 개별 프로그램을 프로파일 링 할 수 있다는 것을 알고 있지만 스크립트 자체를 프로파일 링하여 실행 된 총 시간을 측정 할 수있는 방법이 있는지 알고 싶었습니다. 이 목적으로 사용할 수있는 타이머 프로그램이 있습니까? 그렇다면 측정이 얼마나 정확합니까?


어쩌면 이것은 프로파일 링에 도움이 될 것입니다-bash 쉘 스크립트를 프로파일하는 방법은 무엇입니까? - 스택 오버플로 -> stackoverflow.com/questions/5014823/...
모하마드 Efazati

답변:


10

Jon Lin의 제안에 따라 시간을 사용하여 시작하십시오.

$ time ls test
test

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

스크립트가 실행중인 유닉스는 말하지 않고 Linux에서는 strace, Solaris / AIX에서는 trus를 사용하고 있으며 hp-ux의 tusc를 사용하면 프로세스가 수행하는 작업에 대해 많은 것을 배울 수 있다고 생각합니다. 좋은 요약을 얻으려면 strace의 -c 옵션을 좋아합니다.

]$ 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 (우분투)을 더 자주 사용하기 시작했습니다.
Paul

4

time명령을 확인하십시오 . 이를 사용하여 시간이 소비되는 위치와 같은 다른 유용한 정보와 함께 실행하는 데 걸리는 시간을 측정 할 수 있습니다.


2

정확하게 프로파일 링하는 것은 아니지만 스크립트가 실행될 때 추적 할 수 있습니다. set -xv추적하려는 섹션 앞과 섹션 set +xv뒤에 넣습니다 . set -x실행하는 모든 줄을 표시하는 xtrace를 활성화합니다. set -v상세 모드를 사용하면 변수 지정과 같이 효과는 있지만 실행되지 않는 행도 표시됩니다.

추적 시간 소인을 지정할 수도 있습니다. 모든 라인을 타임 스탬프 할 수있는 터미널 에뮬레이터가 필요합니다. 내가 아는 유일한 것은 Windows 프로그램 인 RealTerm 이지만 Wine과 함께 작동합니다. grabserial실제 직렬 포트를 제외하고는 시도하지 않았지만 을 사용할 수도 있습니다 . 셸을 사용하여 어떤 직렬 장치를 사용하는지 확인할 수 있습니다 ps -p $$(그렇지 않은 경우 출력에 manTTY 열을 포함하는 방법을 찾는 데 사용 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계산해 파이와 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|✔) $
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.