perf是一個面向事件(event-oriented)的性能檢測工具,內置於Linux內核,又稱 perf_events
event 可能的來源:

perf 工具有以下四種 event :
-
software events
使用內核的計數器 kernel counters,記錄系統級事件。例如上下文切換,page fault等 -
hardware events
使用CPU的 Performance Monitoring Unit (PMU),記錄微體系結構(micro-architecture)事件。例如cycle數,指令執行數 instructions retired,L1 cache misses等
PMU是一種寄存器,用於記錄指定事件發生的次數(perf stat -e 多個事件用逗號隔開)。使用PMU計數時,會設定 Sample After Value (SAV)。當PMU的值超過SAV,將觸發一個硬件中斷,中斷處理程序可以收集CPU的IP,調用堆棧,PID等信息,並認為這SAV次事件都是由於當前指令造成的。
hardware events 記錄的誤差可能來自於:
- 超線程共享PMU: 開啟超線程后,一個物理核心被虛擬化為兩個邏輯核心,但依然共用同一個PMU
- 事件滑行(Hardware Event Skid): 硬件延遲或指令流重排導致記錄的IP並沒指向真正發生事件的指令
- 多路復用:如果記錄的事件種類超過了PMU的數量,會對PMU進行多路(時分)復用
- 中斷屏蔽: 用於記錄指令的這個中斷可能會被其它中斷屏蔽掉
詳細參考: Understanding How General Exploration Works in Intel® VTune™ Amplifier
-
hardware cache events
一類特別的 hardware events:有 L1 (d/i)cache, LLC(Last Level Cache), (d/i)TLB, branch 事件 -
tracepoint events
使用內核提供的 ftrace 系統調度追蹤器
最常用到的命令:
perf stat: obtain event counts
perf record: record events for later reporting
perf report: break down events by process, function, etc.
perf annotate: annotate assembly or source code with event counts
perf top: see live event count
perf bench: run different kernel microbenchmarks
更細節的使用方法可以在上述命令后加-h查看
參考資料:
