簡介
在對程式進行最佳化之前,必須先測量其執行狀況,才能有針對性地解決效能問題。Perf 的全名為 Performance Event,是一款自 Linux v2.6.31 起內建於系統中的效能分析工具,並隨核心一同釋出。透過 Perf,使用者可藉由 PMU (Performance Monitoring Unit)、tracepoint,以及核心內部的特殊計數器 (counter) 來收集效能資料,並能同時分析運行中的核心程式碼,從而全面掌握應用程式的效能瓶頸。
與 OProfile 和 GProf 相比,Perf 的優勢在於其與 Linux 核心的緊密結合,並且能充分利用核心中的最新功能特性。Perf 的運作原理是透過對目標進行取樣,記錄在特定條件下事件的發生與發生次數。例如,Perf 可根據 tick 中斷進行取樣,在每次 tick 中斷時觸發取樣點,並記錄行程 (process) 在該時間點的執行上下文 (context)。如果一個行程 90% 的時間花費在函式 foo() 上,那麼大約 90% 的取樣點便會集中在函式 foo() 的執行上下文中。
Perf 支援多種事件的取樣,包括硬體事件 (Hardware events),如 cpu-cycles, instructions, cache-misses, branch-misses 等;軟體事件 (Software events),如 page-faults, context-switches 等;及 Tracepoint 事件。藉由這些資料,我們可深入分析程式效能問題。例如,藉由 cpu-cycles 和 instructions,可計算每個 cycle 執行的指令數 (instruction per cycle),進一步判斷程式碼是否充分利用 CPU 資源。cache-misses 可以揭示程式是否妥善利用了 Locality of reference;而 branch-misses 過多則可能導致嚴重的 pipeline hazard。此外,Perf 還能針對特定函式進行取樣,精確定位效能瓶頸所在的程式碼位置,為問題的解決提供關鍵依據。
使用 perf_events 分析程式效能
修改自羅根學習筆記