perf uncore PEBS

About perf

從2.6.31版本開始,linux內核開始提供了一個正式接口來管理硬件計數器,這個接口就是通過系統調用“perf_event_open” , 同時內核還提供了一個用戶層次的工具來利用這個接口,也就是perf。


perf有兩種可用的模式:計數和採樣。

計數簡單的在整個程序執行的過程中測量發生的事件數目而不會考慮到底是哪些指令或者是哪些函數造成了這些事件的產生。


另一方面,採樣通過IP指令指針給出了這個事件的發生和代碼本身之間的關係。在採樣的過程中,內核告訴CPU上面的PMU,如何選定的事件計數器超過閥值,CPU就發出一箇中斷,內核捕捉這個中斷,然後把採樣的數據,包括IP值,存到ring buffer中。這個buffer會由用戶空間定義的perf工具來週期性的輪詢,並且把它的內容寫入到磁盤中。在後續處理中,IP指針會和二進制文件進行映射,從而確定是哪個函數名產生。


About pmu-tools

pmu-tools是一個在perf上面構建的能夠提供很多intel特殊的採樣功能的工具集。

它並不會替代傳統的perf,而是對它做了一些擴展,或者做了一些wrapper從而可以更直接的使用perf。

pmu-tools的下載地址是http://github.com/andikleen/pmu-tools


## pebs-grabber:
perf並沒有輸出PEBS的輸出,而這個PEBS的輸出其實包含了很多有用的信息。

pebs-grabber從perf中提取PEBS數據,同時這裏假設perf的pebs handler已經在運行。我們同時也對這些PEBS數據做trace point。

我們可能需要對內核接口做一些修改,並且在非常老的內核上可能運行的並不好。


下面的程序會創建兩個新的trace point。一個是trace_pebs_v1另一個是trace_pebs_v2這會log完整的PEBS record。當CPU支持PEBSv2時【haswell微架構】會有另外的域被pebs_v2記錄。

	  make [KDIR=/my/kernel/build/dir]
	  insmod pebs-grabber.ko 
	  # needs to record as root
	  perf record -e cycles:p,pebs_v1,pebs_v2 [command, -a for all etc.]
	  perf report
	  perf script to display pebs data
	  # alternatively trace-cmd and kernelshark can be also used to dump
   	  # the pebs data


引用:

【1】The overhead of profiling using PMU hardware counters

【2】 http://lwn.net/Articles/556983/



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章