25.2. Perf 사용
프로그램 실행의 통계 또는 샘플을 수집하기 위해 기본 PCL 인프라를 사용하는 것은 상대적으로 간단합니다. 이 섹션에서는 전체 통계 및 샘플링의 간단한 예를 제공합니다.
make 및 해당 하위 항목에 대한 통계를 수집하려면 다음 명령을 사용합니다.
# perf stat -- make all
perf 명령은 다양한 하드웨어 및 소프트웨어 카운터를 수집합니다. 그런 다음 다음 정보를 출력합니다.
Performance counter stats for 'make all':
244011.782059 task-clock-msecs # 0.925 CPUs
53328 context-switches # 0.000 M/sec
515 CPU-migrations # 0.000 M/sec
1843121 page-faults # 0.008 M/sec
789702529782 cycles # 3236.330 M/sec
1050912611378 instructions # 1.331 IPC
275538938708 branches # 1129.203 M/sec
2888756216 branch-misses # 1.048 %
4343060367 cache-references # 17.799 M/sec
428257037 cache-misses # 1.755 M/sec
263.779192511 seconds time elapsed
perf 도구는 또한 샘플을 기록할 수 있습니다. 예를 들어 make 명령과 해당 하위 항목에 대한 데이터를 기록하려면 다음을 사용합니다.
# perf record -- make all
이렇게 하면 샘플이 저장되는 파일과 수집된 샘플 수가 출력됩니다.
[ perf record: Woken up 42 times to write data ]
[ perf record: Captured and wrote 9.753 MB perf.data (~426109 samples) ]
PCL(Linux용 성능 counter) 도구는 OProfile과 충돌
OProfile과 PCP for Linux (PCL) 모두 동일한 하드웨어 성능 모니터링 장치 (PMU)를 사용합니다. PCL perf 명령을 사용하려는 동안 OProfile이 실행 중인 경우 OProfile을 시작할 때 다음과 같은 오류 메시지가 발생합니다.
Error: open_counter returned with 16 (Device or resource busy). /usr/bin/dmesg may provide additional information.
Fatal: Not all events could be opened.
perf 명령을 사용하려면 먼저 OProfile을 종료합니다.
# opcontrol --deinit
그런 다음 perf.data 를 분석하여 샘플의 상대적 빈도를 확인할 수 있습니다. 보고서 출력에는 샘플에 대한 명령, 오브젝트 및 기능이 포함됩니다. perf 보고서를 사용하여 분석을 출력합니다. 예를 들어 다음 명령은 가장 많은 시간을 사용하는 실행 파일에 대한 보고서를 생성합니다.
perf.data
# perf report --sort=comm
결과 출력:
# Samples: 1083783860000
#
# Overhead Command
# ........ ...............
#
48.19% xsltproc
44.48% pdfxmltex
6.01% make
0.95% perl
0.17% kernel-doc
0.05% xmllint
0.05% cc1
0.03% cp
0.01% xmlto
0.01% sh
0.01% docproc
0.01% ld
0.01% gcc
0.00% rm
0.00% sed
0.00% git-diff-files
0.00% bash
0.00% git-diff-index
왼쪽의 열에는 샘플의 상대적 양이 표시되어 있습니다. 이 출력은 xsltproc 및cabundle xmltex에서 대부분의 시간을 소비한다는 것을 보여줍니다. 완료하는 데 걸리는 시간을 줄이려면 xsltproc 및 rhcos xmltex 에 집중하십시오. xsltproc 에서 실행한 함수를 나열하려면 다음을 실행합니다.
# perf report -n --comm=xsltproc
이 경우 다음을 생성합니다.
comm: xsltproc
# Samples: 472520675377
#
# Overhead Samples Shared Object Symbol
# ........ .......... ............................. ......
#
45.54%215179861044 libxml2.so.2.7.6 [.] xmlXPathCmpNodesExt
11.63%54959620202 libxml2.so.2.7.6 [.] xmlXPathNodeSetAdd__internal_alias
8.60%40634845107 libxml2.so.2.7.6 [.] xmlXPathCompOpEval
4.63%21864091080 libxml2.so.2.7.6 [.] xmlXPathReleaseObject
2.73%12919672281 libxml2.so.2.7.6 [.] xmlXPathNodeSetSort__internal_alias
2.60%12271959697 libxml2.so.2.7.6 [.] valuePop
2.41%11379910918 libxml2.so.2.7.6 [.] xmlXPathIsNaN__internal_alias
2.19%10340901937 libxml2.so.2.7.6 [.] valuePush__internal_alias