Try   HackMD

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 的首次嘗試

  1. 使用 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 是否設定正確:

    ​​​​cat /proc/sys/kernel/perf_event_paranoid
    

    Ubuntu 24.04 的預設值是 4,可以透過以下指令暫時修改:

    ​​​​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"
    

Perf 的限制

因其本質為取樣測量,通常具有以下限制:

  • 對 lockstep 不具備觀察能力。
  • 當效能瓶頸跟執行順序有關 (例如 A-> B 效能比 B -> A 效能差),無法很好地揭露這個問題。

Perf Cheat Sheet

可以參考 Brendan Gregg perf 筆記

以下列舉常用的 Perf 指令:

快速觀察

perf stat <elf-file-name>

# e.g.,
perf stat ./test
# 紀錄
perf record -F 99 -a -g --sleep 20
# 閱讀報告
perf report -n --stdio

CPU 快取缺失 (cache miss)

如何估算一個程式執行的最優時間?

Reference