有沒有辦法在linux中定期讀取性能計數器?在linux中定期讀取性能計數器
類似perf stat
能夠抽樣每個X週期是我正在尋找的東西。
基本上我希望能夠讀取指令計數器(執行指令的數量)每X個CPU週期的一些程序。
有沒有辦法在linux中定期讀取性能計數器?在linux中定期讀取性能計數器
類似perf stat
能夠抽樣每個X週期是我正在尋找的東西。
基本上我希望能夠讀取指令計數器(執行指令的數量)每X個CPU週期的一些程序。
似乎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 stat
和perf record
針對ls /
驗證了分析結果。 Stat報告了2 634 205個週期,1 725 255條指令,腳本輸出有410個週期事件和189個指令事件。 -c
值越小,讀取的週期似乎就越多。
還有一個-F
選項perf record
,它定期進行採樣。但是,我找不到使用此選項時檢索計數器值的方法。
編輯:perf stat
顯然也在pids上工作,並捕獲數據,直到ctrl-c被按下。修改源代碼應該很容易,因此它總是捕捉N秒,然後在循環中運行它。
您可以輕鬆修改perf stat來執行此操作。
其實,我有一個粗的修改已經實施和將很樂意與大家分享這種變化..
我所做的更改大多在run_perf_stat功能的同時內(!完成)環
只需將while(!done){sleep(1);}下方的線移動到循環內部,並將睡眠改變爲納秒睡眠,並且您希望在
處進行採樣; STDOUT(或STDERR)上的輸出
如果您希望存儲這些值,我建議您創建一個類型爲struct stats的二維數組,並將其與每個樣本進行更新並定期寫入一個文件
好消息:在下一個內核(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毫秒)
怎麼辦你運行perf腳本? 我試過運行 'perf record -e cycles,instructions -c 10000 -R ls;' 'perf script',但是我得到了一個**致命錯誤:no event_list!**錯誤。 – Ben
@Skim奇怪,對我來說只是輸入'perf script'的作品。 'perf report'是否適合你,即記錄的perf.data文件是否正常? – jpa
原來我使用的是舊版本的perf(2.6)。如上所述,perf 3.0.38的工作原理如下。 當我有足夠的代表時,我會回來,並upvote你。 謝謝! – Ben