# Linux2025q1: Perf Write-Up ## perf_events - 即 Perf,可以記錄硬體效能計數器、中斷、Page Fault 等事件。 - 取樣時,理想取樣頻率應該比待測事件發生的頻率高,然而 perf 取樣頻率存在上限 (~10000 Hz),或者使用隨機取樣頻率 - 使用 perf 時,可以調整取樣頻率為如 97, 997, 9973 等質數,以避免取樣週期與事件發生週期一致,出現週期同調 (Lockstep),而有錯誤的統計結果。例如可能造成部分事件永遠無法被觀察到,或某事件頻繁出現導致被誤認為是瓶頸。 - perf 測量事件時應盡可能精準,因為過多事件會導致通用效能計數器耗盡,會改成分時多工,可能使結果精確度下降。 :::warning :warning: 在 perf 中,週期和頻率的意義與平常所學不同,在[運用 Perf 分析程式效能並改善](https://hackmd.io/@sysprog/linux-perf)提到: > - 週期指的是從「開始」到「記錄樣本」之間,事件的發生次數。 > - 目標頻率指的是 perf_events 每秒應該要剛好取得多少樣本。 ::: :::success TODO: 為甚麼 perf 的取樣頻率最好採用質數?這跟質數定理有關係? ::: ### Skid 有時,事件紀錄對應的指令會出現滑行 (skid) 的現象,這與 CPU 流水線會要求指令拆分成微指令 (Micro-Ops) 有關,這些微指令可能會被亂序執行。 ## Perf 的首次嘗試 - 系統規格參考[此處](https://hackmd.io/@dennis40816/linux2025q1-lab0c) - 安裝 perf 流程和相關文件連結請參考[運用 Perf 分析程式效能並改善](https://hackmd.io/@sysprog/linux-perf) 1. 使用 `perf top` 時出現以下畫面:  透過以下指令確認 `perf_event_paranoid` 是否設定正確: ```bash cat /proc/sys/kernel/perf_event_paranoid ``` Ubuntu 24.04 的預設值是 4,可以透過以下指令暫時修改: ```bash sudo sysctl kernel.perf_event_paranoid=<parameter> # 作者設定成 -1 ``` 另外若要檢測 cache miss 則還需要取消 kernel pointer 限制,將 `kernel.kptr_restrict` (當 >=1,會隱藏 kernel pointer 在 `/proc` 中),執行以下: ``` sudo sh -c "echo 0 > /proc/sys/kernel/kptr_restrict" ``` 2. ## Perf 的限制 因其本質為取樣測量,通常具有以下限制: - 對 lockstep 不具備觀察能力。 - 當效能瓶頸跟執行順序有關 (例如 A-> B 效能比 B -> A 效能差),無法很好地揭露這個問題。 ## Perf Cheat Sheet 可以參考 [Brendan Gregg perf 筆記](https://www.brendangregg.com/perf.html) 以下列舉常用的 Perf 指令: **快速觀察** ```bash perf stat <elf-file-name> # e.g., perf stat ./test ``` ```bash! # 紀錄 perf record -F 99 -a -g --sleep 20 # 閱讀報告 perf report -n --stdio ``` **CPU 快取缺失 (cache miss)** ## 如何估算一個程式執行的最優時間? ## Reference - [Performance Evaluation: perf, eBPF](https://hackmd.io/@st9540808/HkBl5kCSU) - [Brendan Gregg perf](https://www.brendangregg.com/perf.html) - [運用 Perf 分析程式效能並改善](https://hackmd.io/@sysprog/linux-perf)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up