| HOME / 정보공유 / AIX 명령어 모음

tprof
tprof tprof 명령 목적 CPU 사용법을 보고합니다. 구문
tprof Program
tprof [ -m ] [ -v ] { -k [ -e ] | -s | -j Java Class | -p Program | -t Process_ID | [ -x Command ] | [ -i Trace_File [ -n Gennames_File ] [ -C { all | List } ] ]}
주:
-s, -k, -e, -j 또는 -p 플래그 중 하나는 반드시 프로파일을 가져오도록 지정되어야 합니다.
마이크로프로파일링을 사용 가능하게 하려면 -m 플래그를 지정해야 합니다.
-x 플래그는 명령행에서 발행된 최종 플래그여야 합니다.
-i 플래그와 -x 플래그는 동시에 지정되지 않을 수도 있습니다.
-n 및 -C 플래그는 -i 플래그와 함께 사용될 수만 있습니다.
Java 클래스는 마이크로프로파일되지 않습니다.
-j 및 -p 플래그는 동시에 지정되지 않을 수도 있습니다.
설명
tprof 명령은 개별적인 프로그램과 시스템 전체에 대한 CPU 이용도를 보고합니다. 이 명령은 CPU-bound일 수 있는 JAVA, C, C++, 또는 FORTRAN 프로그램이 있고 프로그램에서 CPU를 가장 많이 사용하고 있는 섹션을 알려는 사용자에게는 매우 유용한 도구입니다. tprof 명령은 CPU 유휴 시간도 보고합니다. 이러한 보고서는 전역적으로 CPU 이용도를 판별하는 데 유용할 수 있습니다.
tprof 명령은 프로파일될 사용자 프로그램을 지정하고 사용자 프로그램을 실행시킨 다음 보고서를 포함하는 파일 세트를 작성합니다.
운영 시스템에서는, 인터럽트가 주기적으로 발생하여 "housekeeping" 커널 루틴을 수행하도록 허용합니다. 이 housekeeping은 초당 100번 발생합니다. tprof 명령이 호출되면 housekeeping 커널 루틴은 프로세스 ID와 인터럽트 발생시 실행되는 명령어의 주소를 기록합니다. 명령어 주소와 프로세스 ID 모두를 사용하면 tprof 분석 루틴이 CPU 시간을 프로세스 및 스레드, 서브프로그램, 심지어 프로그램의 소스행까지 배분할 수 있습니다. CPU 시간을 소스 프로그램 행에 배분하는 것을 마이크로프로파일링이라고 합니다.
주: 마이크로프로파일링은 -g 플래그와 함께 컴파일된 코드 상에서만 수행할 수 있습니다. tprof 명령이 호출되는 디렉토리인 작업 디렉토리에 소스 코드가 있어야 합니다. proftest 작업 디렉토리는 이 명령에 대한 예에서 사용됩니다.
서브루틴 레벨 프로파일링의 경우, tprof 명령은 실행 가능 프로그램을 수정하지 않고도 수행할 수 있습니다. 특수 컴파일러 플래그 또는 링커 옵션으로 다시 컴파일할 필요는 없습니다. 이는 이미 구축된 실행가능한 모든 모듈의 서브루틴 프로파일을 획득할 수 있음을 의미합니다. 그러나 이미 언급한 대로, 마이크로프로파일을 얻으려면 재컴파일이 필요합니다.
보고서를 포함하는 파일은 상용 디렉토리에 남아 있습니다. tprof 명령으로 작성된 모든 파일 앞에는 ___(두 개의 밑줄)이 옵니다. 밑줄로 접두어를 이용하여 tprof 명령 사용자는 쉽게 모든 tprof 작성 파일을 식별할 수 있습니다. 마이크로프로파일을 위해 특별히 작업 디렉토리를 작성하여 그 디렉토리에 실행가능한 파일 및 소스 파일의 복사본을 배치(또는 링크)하는 것을 권장합니다. 예에서 작업 디렉토리는 proftest입니다.
가장 단순한 tprof 명령 형식은 다음과 같습니다.
tprof -x program
-x Command 플래그를 사용할 때, -s, -k, -j 또는 -p 플래그 중 하나는 고유의 프로파일링 보고서를 가져오도록 지정되어야 합니다. 이러한 플래그가 하나도 지정되지 않을 경우, 요약 보고서만이 작성됩니다. -t 플래그를 사용하면, Process_Id 매개변수에 이름이 지정되어 있는 특정 프로세스에 대한 정보로 보고서를 제한합니다.
-i Trace_File 플래그는 시스템 trace 명령에 의해 작성된 추적 데이터 파일에 대한 tprof의 오프라인 처리를 허용합니다. -n 플래그는 오프라인 파일을 처리할 때 사용될 Gennames_File을 사용자가 지정하도록 합니다. 이러한 플래그는 원격 시스템에서 추적 파일을 사후 처리하거나 한 시점에서 추적 데이터 수집을 수행하고 다른 시점에서 사후 처리를 해야 할 경우에 유용합니다. trace 명령이 완료된 직후에 gennames 파일을 작성해야 합니다. 또한 플래그는 시스템 로드가 많고 추적 후크가 tprof에 의해 누락될 경우 유용합니다. 오프라인 옵션은 이러한 문제점을 경감시켜 줍니다. tprof와 연관된 추적 후크는 trace 명령에 의해 수집되어야 하며 trace -J 플래그에 의해 지정됩니다. gennames 명령은 tprof에 대한 맵핑 정보를 수집하도록 실행됩니다. 일단 trace 및 gennames가 실행되면, trcrpt -r은 추적 로그 파일에서 실행되어야 하고 다른 파일로 재지정되어야 합니다. 이 시점에서 조정된 추적 로그 파일과 Gennames_File이 tprof로 입력됩니다.
예제:
trace -af -T 10000000 -L 10000000 -o trace.out -j 234,106,10C,134,139,00A,465
(프로그램이 수행중이거나 이미 시작되었습니다.)
trcoff
gennames > gennames.out
trcstop
trcrpt -r trace.out > trace.rpt
그리고 나서, 다음과 같이 tprof 명령을 최소한 -i 및 -n 플래그와 함께 호출하십시오.
tprof -i trace.rpt -n gennames.out -s -k -e
위의 추적 후크 번호는 다음과 같이 정의됩니다.
HKWD_TRACE_SYNC 0x000
HKWD_TRACE_TRCON 0x001
HKWD_TRACE_TRCOFF 0x002
HKWD_TRACE_HEADER 0x003
HKWD_TRACE_LWRAP 0x005
HKWD_TRACE_TWRAP 0x006
HKWD_KERN_PROF 0x234
HKWD_KERN_DISPATCH 0x106
HKWD_KERN_IDLE 0x10C
HKWD_SYSC_EXECVE 0x134
HKWD_SYSC_FORK 0x139
HKWD_TRACE_UTIL 0x00A
HKWD_SYSC_CRTHREAD 0x465
주: 성능 분석 도구의 최종 변경사항에 대한 정보를 얻으려면, /usr/lpp/perfagent/README.perfagent.tools 파일을 검토하십시오.
여러 개의 CPU 추적 파일이 trace 디먼에 의해 작성될 경우, 파일의 기준 이름은 -i 플래그 다음에 입력되어야 합니다. -C 플래그는 tprof 명령의 수행 대상을 지정하고 CPU당 tprof 명령 보고서를 생성하는 데 사용할 수 있습니다. -i trc와 -C all을 함께 지정하고 다섯 개의 CPU 추적 파일이 있으면, tprof 명령은 trc-0, trc-1, trc-2, trc-3, 및 trc-4 추적 파일을 처리합니다.
다음 예를 고려하십시오.
tprof -i trc -n gennames_file -C all
tprof -i trc -n gennames_file -C 0,1,2,3,4
여러 개의 CPU ID가 지정되어 있을 경우, 각 추적 파일 및 요약 파일이 작성된 것에 대한 각각의 보고서 파일이 작성됩니다. -i 및 -C 플래그와 함께 -n 플래그가 사용되어야 합니다. 이것은 오프라인 파일을 처리할 때 사용될 Gennames 파일을 사용자가 지정하도록 합니다. 시간이 지나면 변할 수 있는 프로그램 로드 정보를 Gennames 파일이 저장하므로 중요합니다.
다음은 2 CPU 시스템의 예입니다.
trace -C all -af -T 10000000 -L 10000000 -o trace.out -j 234,106,10C,134,139,00A,465
(프로그램이 수행중이거나 이미 시작되었습니다.)
trcoff
gennames > gennames.out
trcstop
/* A trcrpt -r must be run on each trace file created including the anchor file */
trcrpt -r trace.out > trace.rpt
trcrpt -r trace.out-0 > trace.rpt-0
trcrpt -r trace.out-1 > trace.rpt-1
tprof -C all -i trace.rpt -n gennames.out -ske
보고서
접미사 .all이 붙은 요약 보고서는 항상 작성됩니다. 프로그램이 지정되지 않은 경우, 보고서 이름은 __prof.all입니다. 이 보고서에는 tprof 명령이 시스템을 모니터링 하고 있는 동안 실행된 각 프로세스에 소요된 CPU 시간의 양에 대한 추정치도 포함됩니다. 샘플 프로그램이 지정된 경우, 보고서 이름은 __sample.all입니다. 이 보고서에는 tprof 명령이 시스템을 모니터링하고 있는 동안 실행된 예제 프로그램에 소요된 CPU 시간의 양에 대한 추정치도 포함됩니다. 이 보고서에는 예제 프로그램의 각 서브프로그램에서 소요된 CPU 시간의 양에 대한 추정치도 포함됩니다. 요약 보고서는 커널에서 소요된 시간 뿐만 아니라 CPU 유휴 시간의 양도 보여줍니다. tprof 명령은 CPU 시간을 표시(tick)로 표시합니다(여기서 100 표시(tick)는 1초입니다).
예제 1 보고서 A는 예제 요약 보고서를 표시합니다. 첫번째 절에서는 각 프로세스에서 사용한 CPU 시간을 나열합니다. 보고서의 두 번째 절에서는 각 프로세스의 복수 발생에 대한 보고서를 한 행으로 줄여서 보여줍니다.
보고서의 세 번째 절은 프로파일될 프로그램과 연관된 사용자 표시(tick)가 있는 경우에만 작성됩니다. 이 절에서는 서브프로그램 이름과 그 이름이 수집한 표시(tick)의 수를 기록합니다. 서브프로그램의 길이(바이트 단위) 뿐만 아니라 서브프로그램의 컴파일 소스 파일도 같이 주어집니다.
마이크로프로파일이 발생하면, 마이크로프로파일의 대상인 프로그램과 연관된 사용자 표시(tick)가 있을 경우에만 두 개의 보고서가 더 생성됩니다. 이 두 개의 보고서는 작업 디렉토리의 추가 파일로 다음과 같이 tprof 명령에 의해 남겨집니다.
__t.routine_source
프로파일된 소스문 리스트, 소스 파일의 각 루틴마다 하나씩.
__h.source
자주 사용되는 소스문 리스트, 소스 파일의 각 루틴마다 하나씩.
예제 2 보고서 A 및 B는 예제 프로그램의 마이크로프로파일링 결과입니다.
이전에 언급했듯이, 마이크로프로파일을 하려면, 소스 파일의 복사본(일반적으로 .c, .h, 또는 .f를 접미사로 갖습니다)을 작업 디렉토리에 배치해야 합니다. 또한 마이크로프로파일을 해야 하는 실행 파일은 -g 플래그로 컴파일해야 합니다.
마이크로프로파일이 발생하면, -g 플래그로 컴파일된 각 소스 파일의 각 루틴에 대해 한 개의 __t.routine_source 파일이 있습니다. 소스 행 번호와 해당 소스 행과 관련된 티크 수가 마이크로프로파일 텍스트의 왼쪽에 표시됩니다. 각 루틴의 총계는 기능의 끝에 나와 있습니다. 계수는 주석 행, 데이터 선언 또는 매크로 정의와 연관되어서는 안됩니다.
주: tprof는 .c 파일이 다른 .c 파일에 포함되어 있으면 올바른 소스행 정보를 보고할 수 없습니다.
tprof 명령은 보고서를 작성하기 위해 다음 도구를 사용합니다.
cc 및 xlf 명령. 마이크로프로파일에는 C 또는 FORTRAN 컴파일러의 -g 플래그가 필요합니다. 오브젝트 파일(XCOFF)의 형식을 변경하면 tprof 명령이 실패할 수도 있습니다.
stripnm, genkex, genld 및 genkd 명령.
trace 기능. tprof 명령은 추적 기능을 사용하여 해당 주소 샘플을 얻습니다. 추적 오류로 tprof 명령이 실패할 수 있습니다.
gennames 명령으로 오프라인 프로파일링에 대한 이름 리스트를 가져옵니다.
공유 라이브러리
공유 라이브러리로 구축된 실행 모듈을 수행하면 tprof 명령이 공유 코드에서 소요된 CPU 시간 총계의 평가를 보고합니다. -s 플래그가 호출되면 tprof 명령은 서브프로그램 레벨로 공유 라이브러리에서 소요된 시간을 해석합니다.
공유 라이브러리에 소요된 CPU 시간에 대한 보고서를 제공하고 각 공유 라이브러리 유발의 표시(tick)를 위해 그 시간을 서브프로그램 레벨로 해석합니다.
주: -m 플래그와 함께 -v 플래그는 마이크로프로파일을 수행할 수 없는 파일을 나열하는 상세한 마이크로프로파일을 켭니다.
이 보고서에서 수집한 정보를 사용하면, 한 개의 공유 라이브러리 서브프로그램을 소스문 레벨로 마이크로프로파일 할 수 있습니다. 공유 라이브러리의 마이크로프로파일을 하려면, tprof 명령이 호출되는 현재 작업 디렉토리에 연관된 소스 파일을 배치해야 합니다. 마이크로프로파일을 해야 하는 오브젝트 파일은 -g 플래그로 컴파일되어 소속된 라이브러리로 다시 아카이브 되거나 전체 라이브러리를 -g 플래그로 컴파일해야 합니다. 다시 컴파일되거나 다시 아카이브된 라이브러리는 원래 경로에 배치되어야 합니다.
보다 나은 정확성을 위한 여러 번의 수행
해석할 수 있는 CPU 활동 정도는 캡처된 샘플의 수와 "핫스팟" 정도로 결정됩니다. "핫스팟"이 있는 프로그램은 상대적으로 적은 샘플로 프로파일될 수 있는 반면, 자주 실행되지 않는 프로그램 부분은 추가 샘플이 캡처되지 않는 한 프로파일링 보고서에 나타나지 않습니다. 사용자 프로그램이 1분 미만동안 수행되는 경우에는 평가 결과를 확신할 수 없습니다.
간단한 해결책은 필요한 만큼의 분석 결과를 얻을 때까지 사용자 프로그램 또는 스크립트를 반복적으로 실행시키는 것입니다. 프로그램 수행이 길어질수록 프로파일의 분석도는 더 좋아집니다. 프로파일의 정확도가 의심스러울 경우에는 tprof 명령을 여러 번 수행하여 결과 프로파일을 비교하십시오.
다른 인수를 사용하여 여러 번 실행되는 프로그램이나 스크립트를 프로파일하려면, 원하는 프로그램을 실행시키는 스크립트를 사용하여 tprof 명령을 호출해야 합니다. 다음은 lin 프로그램을 다섯 번 수행하는 lin5라는 스크립트의 예제입니다.
./lin; ./lin; ./lin; ./lin; ./lin # execute program lin 5 times
그리고 tprof 명령을 다음과 같이 호출됩니다.
tprof -p ./lin -x ./lin5
다른 예제는 DOIT 스크립트로 이 스크립트는 lin 프로그램을 n번 수행합니다(여기서 n은 DOIT에 대한 인수입니다).
tprof 기능과 prof 및 gprof와의 차이점
이들 세 명령의 가장 중요한 차이점은 tprof 명령은 마이크로프로파일링을 제공하며, gprof 및 prof 명령은 마이크로프로파일링을 제공하지 않는다는 것입니다.
prof 및 gprof 명령은 이 운영 시스템을 포함한 많은 UNIX 시스템에서 지원되는 표준 프로파일링 도구입니다. prof 및 gprof 명령 모두 서브프로그램 프로파일링과 모든 서브프로그램이 호출되는 횟수의 정확한 계수를 제공합니다. gprof 명령은 가장 유용한 "호출 그래프"를 제공하는 데, 이는 고유의 상위 프로그램이 각 서브프로그램을 호출하는 횟수와 각 서브프로그램이 하위 프로그램을 호출하는 횟수를 표시합니다. tprof 명령은 서브프로그램 호출 계수와 호출 그래프 정보를 모두 제공하지는 않습니다.
tprof 명령과 마찬가지로, prof 및 gprof 명령은 모두 사용자 프로그램의 주소 계수기를 초당 100 회의 속도로 샘플링함으로써, 각 서브프로그램에서 사용하는 CPU 소유 시간을 구합니다.
서브프로그램 레벨 프로파일링이 필요할 경우, prof 및 gprof 명령을 사용하려면 사용자가 특수한 링커 플래그를 사용하여 그 프로그램들을 다시 링크해야 합니다. 서브프로그램의 호출 계수를 가져오려면, prof 및 gprof 명령은 모두 사용자가 프로그램을 해당 컴파일 또는 링크 플래그를 사용하여 다시 컴파일하고 다시 링크하는 것을 요구합니다(각각 -p 또는 -pg). 이는 프로파일되어야 하는 응용프로그램을 재컴파일하거나 재링크하는 능력이 없는 사용자에게는 방해가 됩니다. tprof 명령의 경우 소스문 프로파일링이 필요할 경우에만 재컴파일해야 합니다(-g 플래그 사용). tprof 명령은 재컴파일없이 C 또는 FORTRAN 실행가능 파일에서 서브프로그램을 프로파일합니다.
prof 명령을 위해 재링크된 사용자 프로그램의 CPU 시간은 프로파일되지 않은 프로그램의 수행시간과 동일합니다. gprof 명령을 위해 재컴파일되고 재링크된 사용자 프로그램의 CPU 시간은 3개 이상의 요소에 대해 몇 퍼센트씩 증가됩니다. tprof 명령 하에서 프로파일된 사용자 프로그램의 CPU 시간은 프로파일되지 않은 프로그램의 수행시간과 동일합니다.
또한 tprof 명령은 prof와 gprof 명령이 제공하지 못하는, 프로파일된 사용자 프로그램을 수행하는 동안 활성 중인 모든 프로세스의 CPU 사용 요약을 제공합니다.
주: CPU 활동은 초당 100 샘플 비율로 샘플됩니다. 이는 각 서브프로그램의 CPU 소비 추정치가 단기간 수행되는 프로그램의 경우는 정확하지 않을 수 있음을 의미합니다. 그러나 수분 이상 수행되는 프로그램과 프로세스의 경우는 상당히 정확합니다. 시스템 추적 기능은 tprof 명령에 의해서만 사용됩니다. 한번에 단 한 명의 사용자만이 시스템 추적 기능을 사용할 수 있습니다. 따라서 시스템에서 한번에 하나의 tprof 명령만이 활성 중일 수 있습니다. tprof 명령은 CPU-활동 프로파일러입니다. 이 명령은 디스크 또는 메모리와 같은 다른 시스템 자원을 프로파일하지 않습니다.
-C all | List trace 디먼도 -C 플래그와 함께 실행했으면, CPU 보고서당 그리고 누적 보고서에 대해 작성합니다. 멀티-CPU 추적 파일 처리는 오프라인 모드에서만 가능합니다. 리스트를 제공하면 CPU 번호는 쉼표로 구분되어야 합니다(예를 들어, 0,1,2).
주: -C 플래그는 -i와 -n 플래그와 같이 지정해야 합니다.
-e 커널 프로파일링(-k)이 지정된 경우 커널 확장을 프로파일합니다.
주: -m 플래그를 -e 플래그와 함께 사용하면, 커널 확장에 대한 마이크로프로파일이 수행됩니다.
-iTrace_File 오프라인 처리를 위해 추적 파일을 입력합니다.
주: -i 및 -x 플래그는 동시에 지정되지 않을 수도 있습니다.
-k 커널을 프로파일합니다.
-m 마이크로프로파일링을 사용 가능하게 합니다.
주: Java 응용프로그램은 마이크로프로파일되지 않습니다.
-j Java Class 지정한 Java Class를 프로파일합니다.
-nGennames_File -i 플래그와 함께 사용되도록 Gennames_ File을 지정하십시오.
주: -i 플래그를 추적 입력 파일과 함께 제공하지 않으면 Gennames_File을 -n 플래그와 함께 지정하지 마십시오.
-p Program 사용자 프로그램을 프로파일합니다.
주: -m 플래그가 -p 플래그와 함께 사용될 경우, 사용자 프로그램상의 마이크로프로파일링이 수행됩니다. -j와 -p 플래그는 함께 사용할 수 없습니다.
-s 공유 라이브러리를 프로파일합니다.
주: -m 플래그가 -s 플래그와 함께 사용될 경우, 공유 프로그램상의 마이크로프로파일링이 수행됩니다.
-t Process_Id 프로세스 처리 공정 ID가 지정된 Process_Id와 일치하는 프로세스 처리 공정을 프로파일합니다.
-v 상세 모드를 지정합니다. 공유 라이브러리 또는 커널 확장에 대한 마이크로프로파일이 사용 가능 할 경우, 실행가능한 파일 / 오브젝트 파일을 -g 플래그로 컴파일하지 않았거나 tprof이 실행가능한 파일 / 오브젝트 파일을 읽을 수 없으면 -v 플래그는 경고 메세지를 생성합니다.
-xCommand 임의의 Command의 실행을 허용합니다. 다음 플래그 중 하나를 지정하면 프로파일링이 활성화 됩니다. -s, -k 또는 -p.
주: 특정 명령으로 경로를 입력하지 않으면, 명령을 수행하는 데 시스템 호출을 사용하므로 -x 플래그는 명령을 찾기 위해 PATH 환경 변수를 탐색합니다. 정확한 명령이 수행되는지 확인하려면, 명령에 대한 경로를 지정하십시오. 프로그램 이름(-p 플래그)과 명령 이름(-x 플래그)이 같고 전체 경로 또는 상대적 경로가 지정되어 있지 않으면, tprof 명령은 자동으로 PATH 환경 변수를 탐색하여 경로 정보를 추가합니다.
예제
1. C 프로그램 프로파일링
주: 다음 C 프로그램은 유용하지 않습니다. 이는 CPU 주기를 소비하기만 합니다. 프로그램은 예시 목적으로만 사용됩니다.
/* Array Incrementer -- Version 1 */
#include
#define Asize 1024
#define RowDim InnerIndex
#define ColDim OuterIndex
main()
{
int Increment;
int OuterIndex;
int InnerIndex;
int big [Asize][Asize];
/* Initialize every byte of the array to 0x01 */
for (OuterIndex=0; OuterIndex {
for (InnerIndex=0; InnerIndex big [RowDim][ColDim] = 0x01010101;
}
Increment = rand();
/* Increment every element in the array */
for (OuterIndex=0; OuterIndex {
for (InnerIndex=0; InnerIndex {
big [RowDim][ColDim] += Increment;
if (big [RowDim][ColDim] <0)
printf("negative number. %d\n", big[RowDim][Coldim]);
}
}
printf("version 1 check num: %d\n", big[rand()%Asize][rand()%Asize]);
return(0);
}
이 예에서, version1.c는 소스 파일이고 version1은 프로그램입니다. 소스 프로그램 version1.c는 이미 proftest 디렉토리에 있습니다.
서브디렉토리 proftest로 가십시오.
cd proftest
version1.c를 컴파일하십시오.
xlc -o version1 version1.c
version1을 프로파일하고 수행하십시오.
tprof -p ./version1 -x ./version1
__version1.all 파일에서의 프로파일링 출력 보고서를 검사하십시오.
__version1.all 파일의 예가 예제 1 보고서에서 발견됩니다. 물론, 사용자가 작성한 __version1.all 파일은 여기에 표시된 __version1.all 보고서 예제와 다릅니다.
예제 1 보고서 A
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== =====
./version1 4524 5313 287 8 278 1 0
======= === === ===== ====== ==== ====== =====
Total 287 8 278 1 0
Process FREQ Total Kernel User Shared Other
======= === ===== ====== ==== ====== =====
./version1 1 287 8 278 1 0
======= === ===== ====== ==== ====== =====
Total 1 287 8 278 1 0
Total Ticks For ./version1 (USER) = 278
서브루틴 tick % 소스 주소 바이트
============= ===== ==== ========== ======== ======
.main 278 60.4 version1.c 10000340 218
정상적인 조작 중에는 프로세스 이름 및 PID(처리 식별자) 번호를 다시 사용할 수 있습니다. 프로세스가 다른 프로세스를 분기 실행(fork)할 때, 분기 실행(fork)된 프로세스는 원래 프로세스의 프로세스 이름을 계승합니다. 프로세스가 다른 프로세스를 실행시킬 때, 실행된 프로세스는 원래 프로세스의 PID를 계승합니다.
보고서의 첫 섹션은 지정된 프로세스와 스레드를 대신하여 또는 직접 소요한 표시(tick)의 수를 표시합니다(지정된 프로세스가 없으면, 이 섹션은 tprof 모니터링 동안 수행된 모든 프로세스를 표시합니다). 열은 커널 코드, 사용자 코드 및 공유 코드의 표시(tick) 계수를 제공합니다. 프로그램의 이름은 version1이므로 프로파일 되고 있는 프로세스가 version1 프로세스(프로세스 ID 번호는 4524)입니다. 이 프로세스/프로그램은 총 287 ticks를 수집했습니다. 8 표시(tick)는 커널의 주소 공간에서, 278 표시(tick)는 사용자의 주소 공간에서, 1 표시(tick)는 공유 라이브러리 영역에서 수행된 서비스에 대한 것입니다.다른 것은 catchall 범주이며 일반적으로 0입니다.
보고서의 두 번째 절에서는 프로세스 ID에 무관하게 프로그램에서 발생되는 결과를 요약합니다. 이것은 어느 시점에서 각 프로그램을 수행한 다른 여러 프로세스의 수(FREQ)를 표시합니다.
이 보고서의 세번째 섹션은 실행가능한 파일의 각 기능이 사용한 표시(tick)의 수와 각 기능의 표시(tick)가 나타내는 총 수행에 대한 CPU 표시(tick)의 퍼센트를 표시합니다.
주: 프로파일될 프로그램의 사용자 열에 표시(tick)가 없는 경우, 보고서의 세 번째 절은 작성되지 않습니다.
초당 100번의 속도로 표본이 발생합니다. 각 표시(tick)는 1/100초 또는 10 마이크로 초에 해당합니다. 따라서, 예제 1 보고서 A에서, version1은 2.87초를 소비한 것으로 추정됩니다(사용자 공간에서는 2.78초, 커널(시스템) 공간에서 0.08초).
2. C 프로그램 마이크로프로파일링
프로파일링 예제에는 서브프로그램 레벨의 요약 정보가 포함됩니다. 이 예제에서는 마이크로프로파일링 레벨의 CPU 사용법 프로파일링을 제공합니다. 실행시간 측정과 소스문 사이에 상관관계를 만들기 위해, 상용 디렉토리의 tprof 명령에 대해 추가 정보를 제공해야 합니다.
소스 파일 version1.c
-g 플래그와 함께 컴파일하십시오.
프로파일:
tprof -mp ./version1 -x ./version1 # invoke the profiler, telling
# it to execute and profile "version1"
출력 파일 __version1.all은 이전 단계에서 획득한 것과 거의 동일해야 합니다. 물론, version1의 실행 중에 사용되는 모든 프로세스를 요약하는 보고서는 변경됩니다. 또한, 소스에서 주요 정보의 프로파일된 소스를 포함한 __t.main_version1.c 파일 및 소스에서 "가장 자주 사용하는" 행을 포함한 __h.version1.c 파일을 찾을 수 있습니다.
주: 프로파일되는 프로그램의 __program.all 파일에 대한 사용자 열에 표시(tick)가 없으면, __t.routine_source 및 __h.source 파일은 생성되지 않습니다.
예제 2 보고서 A와 B는 위에서 보이는 마이크로프로파일링 예제의 결과를 포함합니다. 예제 2 보고서 A는 __t.main_version1.c의 내용을 표시합니다. 예제 2 보고서 B는 __h.version1.c의 내용을 표시합니다.
예제 2 보고서 A
Ticks Profile for main in ./version1.c
Line Ticks Source
13 1 for (OuterIndex=0; OuterIndex 14 - {
15 17 for (InnerIndex=0; InnerIndex 16 105 big [RowDim][ColDim] = 0x01010101;
17 - }
18 - Increment = rand();
19 - /* Increment every element in the array */
20 - for (OuterIndex=0; OuterIndex 21 - {
22 21 for (InnerIndex=0; InnerIndex 23 - {
24 30 big [RowDim][ColDim] += Increment;
25 104 if (big [RowDim][ColDim] <0)
26 - printf("negative number. %d\n", big[RowDim][ColDim
]);
27 - }
28 - }
29 - printf("version 1 check num: %d\n", big[rand()%Asize][rand(
)%Asize]);
30 - return(0);
31 - }
278 Total Ticks for main in ./version1.c
예제 2 보고서 B
Hot Line Profile for ./version1.c
Line Ticks
16 105
25 104
24 30
22 21
15 17
13 1
3. 여러 개의 소스 파일과 함께 FORTRAN 프로그램 프로파일링
이 예제는 이미 proftest라는 디렉토리에 존재하는 linless.f 및 daxpy.f, 두 개의 FORTRAN 소스 파일을 사용합니다.
서브디렉토리 proftest로 가십시오.
cd proftest
lin2를 linless.f와 daxpy.f, 두 개의 소스 파일을 사용하는 프로그램 파일로 컴파일하십시오.
xlf -o lin2 linless.f daxpy.f
프로그램 lin2를 프로파일하고 수행하십시오.
tprof -p ./lin2 -x ./lin2
__lin2.all 파일에서의 프로파일링 출력 보고서를 검사하십시오.
4. 쉘 스크립트 프로파일링
때때로 사용자는 단일 프로그램이 아닌 프로그램 및 쉘 명령의 연속적인 실행 스크립트를 프로파일하기를 원할 것입니다. 이 에제에서 DOIT 스크립트는 프로그램과 n을 스크립트의 인수로 지정하고 프로그램을 n 번 수행합니다.
# DOIT Shell Script
#!/usr/bin/ksh
i=$2
command=$1
while [ $i -gt 0 ]
do
let i=i-1
$command
완료.
예를 들어, 프로그램 lin을 세 번 수행하려면, 다음과 같이 입력하십시오.
DOIT ./lin 3
이 예제에서, DOIT 스크립트와 lin.f라는 FORTRAN 소스 파일은 이미 proftest라는 디렉토리에 존재합니다.
proftest 서브디렉토리로 가십시오.
cd proftest
lin.f을 -g 플래그로 최적화 해제된 lin 실행 파일으로 컴파일하십시오.
xlf -g -o lin lin.f
-p 플래그를 사용하는 lin 프로파일 프로그램 그리고 스크립트의 이름과 -x 플래그를 사용하여 수행하는 모든 스크립트 인수를 지정합니다.
tprof -p ./lin -x DOIT ./lin 3
이는 문장 레벨의 프로파일링을 제공합니다.
__lin.all 파일에서의 프로파일링 출력 보고서를 검사하십시오.
5. Java 응용프로그램 프로파일링
이 예제는 myclass라는 이름의 Java Class를 사용합니다. 이 클래스는 이미 CLASSPATH에 포함되어 있는 proftest 디렉토리 안에 존재합니다.
Example Java Program myclass.java:
public class myclass
{
public static void main(String args[]) {
int i;
for(i=0;i < 100;i++) {
}
System.out.print("Hello World\n");
}
}
다음을 입력하여 proftest 서브디렉토리로 가십시오.
cd proftest
다음을 입력하여 java 프로그램을 컴파일하십시오.
javac myclass.java
다음을 입력하여 java xlass를 프로파일하고 수행하십시오.
tprof -j myclass -x java -Xrunjpa myclass
__myclass.all 파일에서의 프로파일링 출력 보고서를 검사하십시오.
주: tprof java 프로파일러 에이전트는 java 응용프로그램을 tprof을 통해 또는 독립적으로(-Xrunjpa로) 수행하여도 언제나 추적 파일을 생성합니다. tprof는 이 추적 파일을 사용하여 실시간 모드 및 오프라인 모드, 둘다에서 java 클래스를 프로파일합니다. java 응용프로그램을 시작할 때, -Xrunjpa를 확실히 지정하십시오. 거대한 java 응용프로그램의 경우, 클래스의 가비지 콜렉션을 사용 불가능하게 하는 -noclassgc 플래그와 함께 응용프로그램이 시작되어야 합니다. 이 플래그가 사용되지 않을 경우, java 클래스에 대한 tprof 프로파일링 정보가 부정확할 수도 있습니다.
생성된 __myclass.all의 예제는 아래에 표시되어 있습니다.
Process PID TID Total Kernel User Shared Other
======= === === ===== ====== ==== ====== ===== ====
java 23852 18985 343 28 0 171 0 140
java 23852 18985 1 1 0 0 0 0
======= === === ===== ====== ==== ====== ===== ====
Total 344 29 0 171 0 140
Segment :: 2 21
Process FREQ Total Kernel User Shared Other
======= ==== ===== ====== ==== ====== ===== ====
java 2 344 29 0 171 0 140
======= ==== ===== ====== ==== ====== ===== ====
Total 2 344 29 0 171 0 140
Total System Ticks: 649 (used to calculate function level CPU)
Total JAVA = 144 (ticks accumulated in Java Segment)
Total ticks for myclass (JAVA) = 140
Class Name Ticks % Source Class ID
========== ===== ==== ====== ========
myclass 140 21.6 myclass.java 3008a750
Profile: myclass ( myclass.java )
Method Name Ticks % Method ID Load Addr Size
=========== ===== ==== ========= ========= ====
main [([Ljava/lng/String;)V] 140 21.6 34b09edc 345b2a2c 32c
주: 모든 메소드 이름은 대괄호([]) 안에 해당 기호와 함께 표시됩니다.
메세지
시스템은 다음 메세지를 표시합니다.
/dev/systrace: device busy or trcon: TRCON:no such device
추적 기능이 이미 사용 중임을 의미합니다. 프로그램을 정지시키고 trcstop을 입력해 추적을 정지하십시오.
주: 이 명령은 POWER 기반 플랫폼 및 Itanium 기반 플랫폼, 둘다에서 유효합니다. OS(운영 시스템)가 32 비트인지 64 비트인지에 상관없이 두 가지 추적파일의 유형 모두를 읽을 수 있습니다.
관련 정보
cc 명령, gprof 명령, prof 명령, stripnm 명령 및 trace 디먼.