藉由benchmark我們可以利用執行時間對比同一支程式在不同的CPU之間執行的效能,但如果要針對單一程式做效能分析,只有整體的執行時間無法提供充足資訊讓我們找到效能瓶頸。我們可以利用專門量測效能的hardware來協助取得資訊: PMU/HMP。
Perf是Linux kernel當中提供程式效能分析的system utilities。Perf會利用PMU(提供hardware event counter)以及Linux kernel(提供software event counter)提供程式運行時,在每個function內發生的event數量。
Stat: 量測一隻程式從開始執行到結束時的event數量
在程式開始執行時先讀取PMU的PMC,程式結束執行時再讀取一次PMU的PMC,找到兩組PMC的差就可以得到程式執行過程中發生的even數量
例如: 程式開始前將第一組event selector選擇為instruction count並且將PMC歸零,紀錄到instruction count的PMC初始值為0,而程式結束時記錄到instruction count的PMC值為20000,則可以得知此程式在執行過程中執行了20000條instruction
Record: 對程式進行取樣(sampling),得知一隻程式在什麼function花最多時間以及原因
原理: 利用PMC overflow時會發出interrupt的功能,perf在interrupt發生的時候將PMC的值與當下的PC記錄下來,用以推測每個function的performance
例如: 我們希望觀察程式的cache miss count,並推測cache miss經常發生在哪些function當中,並且使用10000個CPU cycle當作sampling period