2012-08-26 5 views
5

리눅스에서 성능 카운터를 정기적으로 읽는 방법이 있습니까?리눅스에서 주기적으로 성능 카운터를 읽으십시오.

X주기마다 샘플링 할 수있는 기능이있는 perf stat과 같은 기능이 있습니다.

기본적으로 일부 프로그램의 CPU 사용량 X 회마다 명령 카운터 (실행 된 명령 수)를 읽을 수 있기를 바랍니다.

답변

5

Linux의 perf 도구는 일정한 간격으로 샘플링하지 않고 카운터가 특정 값에 도달했을 때 이벤트를 기록하는 것으로 작동합니다.

명령 perf record -e cycles,instructions -c 10000은 10000 사이클마다 및 10000 명령마다 이벤트를 저장합니다. 새로운 명령 또는 기존 PID에 대해 실행할 수 있습니다. 현재 디렉토리의 perf.data에 기록됩니다.

데이터 분석은 또 다른 문제입니다. perf script를 사용하면 아주 가까운 당신을 가져옵니다 당신은 그 출력에서 ​​라인의 무리를 받아 '사이클'그 세트의 '지침'이벤트의 수를 계산하는 스크립트를 작성해야

ls 16040 2152149.005813: cycles:   c113a068 ([kernel.kallsyms]) 
ls 16040 2152149.005820: cycles:   c1576af0 ([kernel.kallsyms]) 
ls 16040 2152149.005827: cycles:   c10ed6aa ([kernel.kallsyms]) 
ls 16040 2152149.005831: instructions:   c1104b30 ([kernel.kallsyms]) 
ls 16040 2152149.005835: cycles:   c11777c1 ([kernel.kallsyms]) 
ls 16040 2152149.005842: cycles:   c10702a8 ([kernel.kallsyms]) 
... 

. 레코딩 명령에서 -c 10000 매개 변수를 변경하여 해상도를 조정할 수 있습니다.

perf statperf recordls /에 대해 실행하여 분석을 확인했습니다. Stat는 2 634 205 사이클, 1 725 255 명령을보고하고 스크립트 출력은 410 사이클 이벤트와 189 명령 이벤트를보고했습니다. -c 값이 작을수록 더 많은 오버 헤드가주기 판독 값에있는 것으로 보입니다.

perf record에 대한 -F 옵션도 정기적으로 샘플링됩니다. 그러나이 옵션을 사용할 때 카운터 값을 검색하는 방법을 찾지 못했습니다.

편집 :perf statperf stat은 분명히 pids에서도 작동하며 ctrl-c를 누를 때까지 데이터를 캡처합니다. 항상 N 초 동안 캡처 한 다음 루프에서 실행되도록 소스를 수정하는 것이 매우 쉽습니다.

+0

당신은 perf 스크립트를 실행합니까? 'perf record -e cycles, instructions -c 10000 -R ls;' 'perf script'를 실행하려고했지만 ** fatality : no event_list! ** 오류가 발생했습니다. – Ben

+0

@Skim 이상하다. 단지'perf script' 만 입력하면된다. 'perf report'가 효과가 있습니까? 즉, 기록 된 perf.data 파일이 괜찮습니까? – jpa

+0

밝혀졌습니다 이전 버전의 perf (2.6)를 사용하고있었습니다. 위에 명시된대로 perf 3.0.38 작품. 충분한 담당자가있을 때 다시 올거야. 감사합니다. – Ben

0

이렇게하려면 perf stat를 쉽게 수정할 수 있습니다.

는 사실, 내가 만든 변경 사항이있는 동안 내 run_perf_stat 기능에 대부분이다

.. 원유 변경이 이미 구현하고이 변화를 공유 기쁠이 (! 완료) 루프

while (! done) {sleep (1);} 아래의 줄을 루프 내부로 이동하고 샘플링 할 기간이있는 나노 슬립으로 변경하십시오.

이렇게하면 perf 인쇄 STDOUT (또는 STDERR)의 출력

이 값을 저장하려면 struct stats 유형의 2 차원 배열을 만들어 모든 샘플에 업데이트하고 파일에 주기적으로 기록하는 것이 좋습니다

4

좋은 소식 : 다음 커널 (Linux 3.9)에서는 perf stat에는 일정한 시간 간격으로 이벤트 델타를 인쇄하는 옵션 -I msecs이 있습니다.

https://patchwork.kernel.org/patch/2004891/

$ perf stat -I 1000 -e cycles noploop 10 
noploop for 10 seconds 
1.000086918   2385155642 cycles     # 0.000 GHz 
2.000267937   2392279774 cycles     # 0.000 GHz 
3.000385400   2390971450 cycles     # 0.000 GHz 
4.000504408   2390996752 cycles     # 0.000 GHz 
5.000626878   2390853097 cycles     # 0.000 GHz 

http://man7.org/linux/man-pages/man1/perf-stat.1.html

-I msecs, --interval-print msecs 

인쇄 카운트 델타 모든 N 밀리 초를 (최소 : 10ms의) 어떻게

+0

머리를 주셔서 감사합니다. – Ben

+0

옵션은 1 초 인쇄를위한'-I 1000'입니다 : http://man7.org/linux/man-pages/man1/perf-stat.1.html -'-I msecs, --interval-print msecs' "N 밀리 초마다 인쇄 카운트 델타 (최소 : 10ms)" – osgx

관련 문제