2012-08-26 44 views
5

有沒有辦法在linux中定期讀取性能計數器?在linux中定期讀取性能計數器

類似perf stat能夠抽樣每個X週期是我正在尋找的東西。

基本上我希望能夠讀取指令計數器(執行指令的數量)每X個CPU週期的一些程序。

回答

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 record針對ls /驗證了分析結果。 Stat報告了2 634 205個週期,1 725 255條指令,腳本輸出有410個週期事件和189個指令事件。 -c值越小,讀取的週期似乎就越多。

還有一個-F選項perf record,它定期進行採樣。但是,我找不到使用此選項時檢索計數器值的方法。

編輯:perf stat顯然也在pids上工作,並捕獲數據,直到ctrl-c被按下。修改源代碼應該很容易,因此它總是捕捉N秒,然後在循環中運行它。

+0

怎麼辦你運行perf腳本? 我試過運行 'perf record -e cycles,instructions -c 10000 -R ls;' 'perf script',但是我得到了一個**致命錯誤:no event_list!**錯誤。 – Ben

+0

@Skim奇怪,對我來說只是輸入'perf script'的作品。 'perf report'是否適合你,即記錄的perf.data文件是否正常? – jpa

+0

原來我使用的是舊版本的perf(2.6)。如上所述,perf 3.0.38的工作原理如下。 當我有足夠的代表時,我會回來,並upvote你。 謝謝! – Ben

0

您可以輕鬆修改perf stat來執行此操作。

其實,我有一個粗的修改已經實施和將很樂意與大家分享這種變化..

我所做的更改大多在run_perf_stat功能的同時內(!完成)環

只需將while(!done){sleep(1);}下方的線移動到循環內部,並將睡眠改變爲納秒睡眠,並且您希望在

處進行採樣; STDOUT(或STDERR)上的輸出

如果您希望存儲這些值,我建議您創建一個類型爲struct stats的二維數組,並將其與每個樣本進行更新並定期寫入一個文件

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毫秒(最低:10毫秒)

+0

謝謝你的擡頭。 – Ben

+0

選項是「-I 1000」1秒打印:http://man7.org/linux/man-pages/man1/perf-stat.1.html - '-I msecs,--interval-print msecs' 「每N毫秒打印計數增量(最少10ms)」 – osgx