Linux2025q1: Perf Write-Up
perf_events
- 即 Perf,可以記錄硬體效能計數器、中斷、Page Fault 等事件。
- 取樣時,理想取樣頻率應該比待測事件發生的頻率高,然而 perf 取樣頻率存在上限 (~10000 Hz),或者使用隨機取樣頻率
- 使用 perf 時,可以調整取樣頻率為如 97, 997, 9973 等質數,以避免取樣週期與事件發生週期一致,出現週期同調 (Lockstep),而有錯誤的統計結果。例如可能造成部分事件永遠無法被觀察到,或某事件頻繁出現導致被誤認為是瓶頸。
- perf 測量事件時應盡可能精準,因為過多事件會導致通用效能計數器耗盡,會改成分時多工,可能使結果精確度下降。
Image Not Showing
Possible Reasons
- The image file may be corrupted
- The server hosting the image is unavailable
- The image path is incorrect
- The image format is not supported
Learn More →
在 perf 中,週期和頻率的意義與平常所學不同,在運用 Perf 分析程式效能並改善提到:
- 週期指的是從「開始」到「記錄樣本」之間,事件的發生次數。
- 目標頻率指的是 perf_events 每秒應該要剛好取得多少樣本。
TODO: 為甚麼 perf 的取樣頻率最好採用質數?這跟質數定理有關係?
Skid
有時,事件紀錄對應的指令會出現滑行 (skid) 的現象,這與 CPU 流水線會要求指令拆分成微指令 (Micro-Ops) 有關,這些微指令可能會被亂序執行。
Perf 的首次嘗試
-
使用 perf top
時出現以下畫面:
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
透過以下指令確認 perf_event_paranoid
是否設定正確:
Ubuntu 24.04 的預設值是 4,可以透過以下指令暫時修改:
另外若要檢測 cache miss 則還需要取消 kernel pointer 限制,將 kernel.kptr_restrict
(當 >=1,會隱藏 kernel pointer 在 /proc
中),執行以下:
Perf 的限制
因其本質為取樣測量,通常具有以下限制:
- 對 lockstep 不具備觀察能力。
- 當效能瓶頸跟執行順序有關 (例如 A-> B 效能比 B -> A 效能差),無法很好地揭露這個問題。
Perf Cheat Sheet
可以參考 Brendan Gregg perf 筆記
以下列舉常用的 Perf 指令:
快速觀察
CPU 快取缺失 (cache miss)
如何估算一個程式執行的最優時間?
Reference