Intel CPU 上使用 pmu-tools 进行 TopDown 分析
title: Intel CPU 上使用 pmu-tools 進行 TopDown 分析
date: 2021-01-24 18:40
author: gatieme
tags:
- debug
- linux
- todown
categories:
- debug
thumbnail:
blogexcerpt: 這篇文章旨在幫助希望更好地分析其應用程序中性能瓶頸的人們. 有許多現有的方法可以進行性能分析, 但其中沒有很多方法既健壯又正式. 而 TOPDOWN 則為大家進行軟硬協同分析提供了無限可能. 本文通過 pmu-tools 入手幫助大家進行 TOPDOWN 分析.
| 紫夜闌珊-青伶巷草 | LDD-LinuxDeviceDrivers | Intel CPU 上使用 pmu-tools 進行 TopDown 分析 |
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可, 轉載請注明出處, 謝謝合作.
因本人技術水平和知識面有限, 內容如有紕漏或者需要修正的地方, 歡迎大家指正, 鄙人在此謝謝啦
1 Topdown & PMU-TOOLS 簡介
1.1 TopDown 簡介
程序的執行效率是完全依賴與 CPU 執行的, 軟件的性能優化, 除了通用的一些優化外, 更重要的是軟硬協同優化, 充分發揮 CPU 的硬件特性. 因此我們軟件上的一些性能問題, 可以在 CPU 執行流程中的某一環直觀的顯現出來. 但是由于 CPU 的復雜性, 普通用戶和軟件開發人員很難也很少有經歷去弄懂 CPU 架構, 更不用談從 CPU 架構上理解軟件上那一塊出現的問題.
如果有一套軟硬協同的分析方法, 可以幫助用戶快速了解/分析/定界/定位 當前應用在 CPU 上的性能瓶頸, 用戶就可以針對當前 CPU 有針對性的修改自己的程序, 以充分利用當前的硬件資源.
因此 Intel 提出了一套軟硬協同進行性能分析的更正式的方法. 它稱為自上而下的微體系結構分析方法(TMAM) (<英特爾?64和IA-32架構優化參考手冊> 附錄B.1). 在這種方法論中, 我們嘗試從高層組件(如前端, 后端, 退休, 分支預測器)開始檢測導致執行停滯的原因, 并縮小性能低效的根源.
進行 TOPDOWN 分析的過程通過是一個不斷迭代優化的過程, 他的通常流程如下
確定性能問題的類型;
1.1. 我們可以先從高層次的劃分中, 先粗粒度的當前性能問題主要問題是在哪個階段(類型).
1.2. 接著從低層次的劃分中, 繼續明確具體是哪塊出的問題.
使用精確事件 PEBS(X86)/SPE(ARM64) 在代碼中找到確切的位置;
2.1. 如果條件運行, 精確的抓取對應的 PMU 事件, 明確代碼中出現問題的原因和位置.
解決性能問題后, 重新開始 1.
3.1. 修改代碼, 解決性能問題, 然后重新進行 TOPDOWN 分析, 驗證修改是否 OK, 看是否還有其他瓶頸或者是否引入其他問題.
1.2 TopDown 資料匯總
Top-down Microarchitecture Analysis Method(TMAM)資料
之前介紹過TMAM的具體內容, 在這里對網絡上相關的信息和資料做一個匯總:
- 國外資料
Tuning Applications Using a Top-down Microarchitecture Analysis Method
Top-down Microarchitecture Analysis through Linux perf and toplev tools
A Top-Down method for performance analysis and counters architecture
Performance_Analysis_in_a_Nutshell
Top Down Analysis Never lost with Xeon? perf. counters
How TMA* Addresses Challenges in Modern Servers and Enhancements Coming in IceLake
- 國內資料
幾句話說清楚15:Top-Down性能分析方法資料及Toplev使用
讓 CPU 黑盒不再黑盒
1.3 PMU-TOOLS 簡介
pmu-tools 是 Intel 的 Adni Kleen 開發的幫助用戶和開發者在 Intel X86 CPU 下進行 TOPDOWN 分析的開源工具包, 可以定位和分析 CPU Bound 代碼的瓶頸, 不能識別其他(Not bound by CPU)代碼的瓶頸.
2 PMU-TOOLS 安裝
2.1 下載 github 倉庫
git clone https://github.com/andikleen/pmu-tools
2.2 下載 PMU 表
pmu-tools 完成的具體工作就是采集 PMU 數據, 并按照微架構既定的公式計算 topdown 數據, 但是不同的微架構和 CPU 所支持的 PMU 事件是不同的, 因此 pmu-tools提供了一套完成的映射表, 標記不同 CPU 所支持的 PMU 事件映射表, 以及 topdown 如何使用這些 PMU 數據去計算, 參見 Intel 01.day perfmon 下載.
pmu-tools 的工具在第一次運行的時會通過 event_download.py 把本機環境的 PMU 映射表自動下載下來, 但是前提是你的機器能正常連接 01.day 的網絡. 很抱歉我司內部的服務器都是不行的, 因此 pmu-tools 也提供了手動下載的方式.
因此當我們的環境根本無法連接外部網絡的時候, 我們只能通過其他機器下載實際目標環境的事件映射表下載到另一個系統上, 有點交叉編譯的意思.
- 首先獲取目標機器的 CPU 型號
cpu的型號信息是由 vendor_id/cpu_family/model/stepping 等幾個標記的.
他其實標記了當前 CPU 是哪個系列那一代的產品, 對應的就是其微架構以及版本信息.
注意我們使用了 %X 按照 16 進制來打印
注意上面的命令顯示制定了 vendor_id 等信息, 因為當前服務器端的 CPU 前面基本默認是 GenuineIntel-6 等.
不過如果我們是其他機器, 最好查看下 cpufino 信息確認.
比如我這邊機器的 CPU 型號為 :
processor : 7 vendor_id : GenuineIntel` cpu family : 6 model : 85 model name : Intel(R) Xeon(R) Gold 6161 CPU @ 2.20GHz stepping : 4 microcode : 0x1對應的結果就是 GenuineIntel-6-55-4.
我們也可以直接用 -v 打出來 CPU 信息.
$ python ./event_download.py -vMy CPU GenuineIntel-6-55-4- 獲取 PMU 映射表
如果你可以鏈接網絡, 那么這個命令就會把你 host 機器上的 PMU 映射表下載下來. 否則你拿到了 CPU 型號, 那么你可以直接顯式指定 CPU 型號來獲取.
$ python ./event_download.py GenuineIntel-6-55-4Downloading https://download.01.org/perfmon/mapfile.csv to mapfile.csv Downloading https://download.01.org/perfmon/SKX/skylakex_core_v1.24.json to GenuineIntel-6-55-4-core.json Downloading https://download.01.org/perfmon/SKX/skylakex_matrix_v1.24.json to GenuineIntel-6-55-4-offcore.json Downloading https://download.01.org/perfmon/SKX/skylakex_fp_arith_inst_v1.24.json to GenuineIntel-6-55-4-fp_arith_inst.json Downloading https://download.01.org/perfmon/SKX/skylakex_uncore_v1.24.json to GenuineIntel-6-55-4-uncore.json Downloading https://download.01.org/perfmon/SKX/skylakex_uncore_v1.24_experimental.json to GenuineIntel-6-55-4-uncoreexperimental.json my event list /home/chengjian/.cache/pmu-events/GenuineIntel-6-55-4-core.json最終 PMU 的映射表文件, 將被保存在 ~/.cache/pmu-events. 將此目錄打包后, 放到目標機器上解壓即可.
當前我們也可以使用 event_download.py -a 下載所有可用的 PMU 事件映射表. 然后通過如下環境變量, 將 PMU 映射手動指向正確的文件.
export EVENTMAP=~/.cache/pmu-events/GenuineIntel-6-55-4-core.json export OFFCORE=~/.cache/pmu-events/GenuineIntel-6-55-4-offcore.json export UNCORE=~/.cache/pmu-events/GenuineIntel-6-55-4-uncore.json最后兩個 offcore/uncore 的設置是可選的. 或者可以將名稱設置為 CPU 標識符(GenuineIntel-FAM-MODEL), 這將覆蓋當前 CPU.
另一種方法是顯式設置目標機器的 PMU 映射文件存儲路徑( 注意是在相對于它的 pmu-events 目錄中).
export XDG_CACHE_DIR=/opt/cache則將從 /opt/cache/pmu-events 中查找對應的映射文件.
3 PMU-TOOLS 使用
3.1 準備工作
特別需要注意的是, pmu-tools 的大多數工作在使用期間都建議我們禁用 NMI watchdog, 并以 root 身份運行.
因為 X86_64 的 NMI_WATCHDOG 使用了一些 PMU 的寄存器, 同時我們在抓取的時候可能耗時過長, 存在出發 NMI_WATCHDOG 的影響.
Consider disabling nmi watchdog to minimize multiplexing (echo 0 > /proc/sys/kernel/nmi_watchdog as root)使用如下命令關閉
sysctl -p 'kernel.nmi_watchdog=0'ORecho 0 > /proc/sys/kernel/nmi_watchdog3.1 toplev
toplev 是一個基于 perf 和 TMAM 方法的應用性能分析工具. 從之前的介紹文章中可以了解到 TMAM 本質上是對 CPU Performance Counter 的整理和加工. 取得 Performance Counter 的讀數需要 perf 來協助, 對讀數的計算進而明確是 Frondend bound 還是 Backend bound 等等.
在最終計算之前, 你大概需要做三件事:
這三步可以自動化地由程序來做. 本質上 toplev 就是在做這件事.
toplev的Github地址: https://github.com/andikleen/pmu-tools
另外補充一下, TMAM作為一種Top-down方法, 它一定是分級的. 通過上一級的結果下鉆, 最終定位性能瓶頸. 那么toplev在執行的時候, 也一定是包含這個“等級”概念的.
下面是 toplev 使用方法的資料:
toplev manual
pmu-tools, part II: toplev
基本上都是由 toplev 的開發者自己寫的, 可以作為一個 Quick Start Guide.
首先可以進行 L1 級別的檢查
$ python toplev.py --core S0-C0 -l1 -v --no-desc taskset -c 0 ./a.out ... S0-C0 FE Frontend_Bound: % Slots 19.2 < S0-C0 BAD Bad_Speculation: % Slots 4.6 < S0-C0 BE Backend_Bound: % Slots 4.1 < S0-C0 RET Retiring: % Slots 72.1 < S0-C0-T0 MUX: % 100.0 S0-C0-T1 MUX: % 100.0接著進行 level2/level3 級別的檢查, 最大支持到 level6.
$ python toplev.py --core S0-C0 -l2 -v --no-desc taskset -c 0 ./a.out $ python toplev.py --core S0-C0 -l3 -v --no-desc taskset -c 0 ./a.outtoplev 工具是基于 perf 等工具進行采樣的, 因此多數這些工作支持的行為, toplev 也是支持的.
-
默認情況下, toplev 同時測量內核和用戶代碼. 如果只對用戶代碼感興趣, 則可以使用 --user 選項. 這往往會減少測量噪聲, 因為中斷被過濾掉了. 還有一個 --kernel 選項用來測量內核代碼.
-
在具有多個階段的復雜工作負載上, 測量間隔也是有用的. 這可以用 -I xxxi 選項指定, xxx 是間隔的毫秒數. perf 要求時間間隔至少需要 100ms. toplev 將輸出每個間隔的測量值. 這往往會產生大量的數據, 所以繪制輸出很有必要.
更多詳細信息可以參照 topdev 的 help 幫助文檔.
4 參考資料
Top-Down performance analysis methodology
-
本作品/博文 ( AderStep-紫夜闌珊-青伶巷草 Copyright ?2013-2017 ), 由 成堅(gatieme) 創作.
-
采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可. 歡迎轉載、使用、重新發布, 但務必保留文章署名成堅gatieme ( 包含鏈接: http://blog.csdn.net/gatieme ), 不得用于商業目的.
-
基于本文修改后的作品務必以相同的許可發布. 如有任何疑問, 請與我聯系.
總結
以上是生活随笔為你收集整理的Intel CPU 上使用 pmu-tools 进行 TopDown 分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨界教授林宙辰:从北大来,回北大去
- 下一篇: 计算机网络安全的对策有哪些,计算机网络安