日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Intel CPU 上使用 pmu-tools 进行 TopDown 分析

發(fā)布時(shí)間:2023/12/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Intel CPU 上使用 pmu-tools 进行 TopDown 分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

title: Intel CPU 上使用 pmu-tools 進(jìn)行 TopDown 分析
date: 2021-01-24 18:40
author: gatieme
tags:
- debug
- linux
- todown
categories:
- debug

thumbnail:
blogexcerpt: 這篇文章旨在幫助希望更好地分析其應(yīng)用程序中性能瓶頸的人們. 有許多現(xiàn)有的方法可以進(jìn)行性能分析, 但其中沒有很多方法既健壯又正式. 而 TOPDOWN 則為大家進(jìn)行軟硬協(xié)同分析提供了無限可能. 本文通過 pmu-tools 入手幫助大家進(jìn)行 TOPDOWN 分析.


CSDNGitHubOSKernelLAB
紫夜闌珊-青伶巷草LDD-LinuxDeviceDriversIntel CPU 上使用 pmu-tools 進(jìn)行 TopDown 分析

本作品采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進(jìn)行許可, 轉(zhuǎn)載請(qǐng)注明出處, 謝謝合作.

因本人技術(shù)水平和知識(shí)面有限, 內(nèi)容如有紕漏或者需要修正的地方, 歡迎大家指正, 鄙人在此謝謝啦


1 Topdown & PMU-TOOLS 簡(jiǎn)介


1.1 TopDown 簡(jiǎn)介


程序的執(zhí)行效率是完全依賴與 CPU 執(zhí)行的, 軟件的性能優(yōu)化, 除了通用的一些優(yōu)化外, 更重要的是軟硬協(xié)同優(yōu)化, 充分發(fā)揮 CPU 的硬件特性. 因此我們軟件上的一些性能問題, 可以在 CPU 執(zhí)行流程中的某一環(huán)直觀的顯現(xiàn)出來. 但是由于 CPU 的復(fù)雜性, 普通用戶和軟件開發(fā)人員很難也很少有經(jīng)歷去弄懂 CPU 架構(gòu), 更不用談從 CPU 架構(gòu)上理解軟件上那一塊出現(xiàn)的問題.

如果有一套軟硬協(xié)同的分析方法, 可以幫助用戶快速了解/分析/定界/定位 當(dāng)前應(yīng)用在 CPU 上的性能瓶頸, 用戶就可以針對(duì)當(dāng)前 CPU 有針對(duì)性的修改自己的程序, 以充分利用當(dāng)前的硬件資源.

因此 Intel 提出了一套軟硬協(xié)同進(jìn)行性能分析的更正式的方法. 它稱為自上而下的微體系結(jié)構(gòu)分析方法(TMAM) (<英特爾?64和IA-32架構(gòu)優(yōu)化參考手冊(cè)> 附錄B.1). 在這種方法論中, 我們嘗試從高層組件(如前端, 后端, 退休, 分支預(yù)測(cè)器)開始檢測(cè)導(dǎo)致執(zhí)行停滯的原因, 并縮小性能低效的根源.

進(jìn)行 TOPDOWN 分析的過程通過是一個(gè)不斷迭代優(yōu)化的過程, 他的通常流程如下

  • 確定性能問題的類型;
    1.1. 我們可以先從高層次的劃分中, 先粗粒度的當(dāng)前性能問題主要問題是在哪個(gè)階段(類型).
    1.2. 接著從低層次的劃分中, 繼續(xù)明確具體是哪塊出的問題.

  • 使用精確事件 PEBS(X86)/SPE(ARM64) 在代碼中找到確切的位置;
    2.1. 如果條件運(yùn)行, 精確的抓取對(duì)應(yīng)的 PMU 事件, 明確代碼中出現(xiàn)問題的原因和位置.

  • 解決性能問題后, 重新開始 1.
    3.1. 修改代碼, 解決性能問題, 然后重新進(jìn)行 TOPDOWN 分析, 驗(yàn)證修改是否 OK, 看是否還有其他瓶頸或者是否引入其他問題.

  • 1.2 TopDown 資料匯總


    Top-down Microarchitecture Analysis Method(TMAM)資料
    之前介紹過TMAM的具體內(nèi)容, 在這里對(duì)網(wǎng)絡(luò)上相關(guān)的信息和資料做一個(gè)匯總:

    • 國外資料

    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

    • 國內(nèi)資料

    幾句話說清楚15:Top-Down性能分析方法資料及Toplev使用

    讓 CPU 黑盒不再黑盒

    1.3 PMU-TOOLS 簡(jiǎn)介


    pmu-tools 是 Intel 的 Adni Kleen 開發(fā)的幫助用戶和開發(fā)者在 Intel X86 CPU 下進(jìn)行 TOPDOWN 分析的開源工具包, 可以定位和分析 CPU Bound 代碼的瓶頸, 不能識(shí)別其他(Not bound by CPU)代碼的瓶頸.

    2 PMU-TOOLS 安裝


    2.1 下載 github 倉庫


    git clone https://github.com/andikleen/pmu-tools

    2.2 下載 PMU 表


    pmu-tools 完成的具體工作就是采集 PMU 數(shù)據(jù), 并按照微架構(gòu)既定的公式計(jì)算 topdown 數(shù)據(jù), 但是不同的微架構(gòu)和 CPU 所支持的 PMU 事件是不同的, 因此 pmu-tools提供了一套完成的映射表, 標(biāo)記不同 CPU 所支持的 PMU 事件映射表, 以及 topdown 如何使用這些 PMU 數(shù)據(jù)去計(jì)算, 參見 Intel 01.day perfmon 下載.

    pmu-tools 的工具在第一次運(yùn)行的時(shí)會(huì)通過 event_download.py 把本機(jī)環(huán)境的 PMU 映射表自動(dòng)下載下來, 但是前提是你的機(jī)器能正常連接 01.day 的網(wǎng)絡(luò). 很抱歉我司內(nèi)部的服務(wù)器都是不行的, 因此 pmu-tools 也提供了手動(dòng)下載的方式.

    因此當(dāng)我們的環(huán)境根本無法連接外部網(wǎng)絡(luò)的時(shí)候, 我們只能通過其他機(jī)器下載實(shí)際目標(biāo)環(huán)境的事件映射表下載到另一個(gè)系統(tǒng)上, 有點(diǎn)交叉編譯的意思.

    • 首先獲取目標(biāo)機(jī)器的 CPU 型號(hào)
    printf "GenuineIntel-6-%X\n" $(awk '/model\s+:/ { print $3 ; exit } ' /proc/cpuinfo )

    cpu的型號(hào)信息是由 vendor_id/cpu_family/model/stepping 等幾個(gè)標(biāo)記的.

    他其實(shí)標(biāo)記了當(dāng)前 CPU 是哪個(gè)系列那一代的產(chǎn)品, 對(duì)應(yīng)的就是其微架構(gòu)以及版本信息.

    注意我們使用了 %X 按照 16 進(jìn)制來打印

    注意上面的命令顯示制定了 vendor_id 等信息, 因?yàn)楫?dāng)前服務(wù)器端的 CPU 前面基本默認(rèn)是 GenuineIntel-6 等.

    不過如果我們是其他機(jī)器, 最好查看下 cpufino 信息確認(rèn).

    比如我這邊機(jī)器的 CPU 型號(hào)為 :

    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

    對(duì)應(yīng)的結(jié)果就是 GenuineIntel-6-55-4.

    我們也可以直接用 -v 打出來 CPU 信息.

    $ python ./event_download.py -vMy CPU GenuineIntel-6-55-4
    • 獲取 PMU 映射表

    如果你可以鏈接網(wǎng)絡(luò), 那么這個(gè)命令就會(huì)把你 host 機(jī)器上的 PMU 映射表下載下來. 否則你拿到了 CPU 型號(hào), 那么你可以直接顯式指定 CPU 型號(hào)來獲取.

    $ 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. 將此目錄打包后, 放到目標(biāo)機(jī)器上解壓即可.

    當(dāng)前我們也可以使用 event_download.py -a 下載所有可用的 PMU 事件映射表. 然后通過如下環(huán)境變量, 將 PMU 映射手動(dòng)指向正確的文件.

    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

    最后兩個(gè) offcore/uncore 的設(shè)置是可選的. 或者可以將名稱設(shè)置為 CPU 標(biāo)識(shí)符(GenuineIntel-FAM-MODEL), 這將覆蓋當(dāng)前 CPU.

    另一種方法是顯式設(shè)置目標(biāo)機(jī)器的 PMU 映射文件存儲(chǔ)路徑( 注意是在相對(duì)于它的 pmu-events 目錄中).

    export XDG_CACHE_DIR=/opt/cache

    則將從 /opt/cache/pmu-events 中查找對(duì)應(yīng)的映射文件.

    3 PMU-TOOLS 使用


    3.1 準(zhǔn)備工作


    特別需要注意的是, pmu-tools 的大多數(shù)工作在使用期間都建議我們禁用 NMI watchdog, 并以 root 身份運(yùn)行.

    因?yàn)?X86_64 的 NMI_WATCHDOG 使用了一些 PMU 的寄存器, 同時(shí)我們?cè)谧ト〉臅r(shí)候可能耗時(shí)過長, 存在出發(fā) NMI_WATCHDOG 的影響.

    Consider disabling nmi watchdog to minimize multiplexing (echo 0 > /proc/sys/kernel/nmi_watchdog as root)

    使用如下命令關(guān)閉

    sysctl -p 'kernel.nmi_watchdog=0'ORecho 0 > /proc/sys/kernel/nmi_watchdog

    3.1 toplev


    toplev 是一個(gè)基于 perf 和 TMAM 方法的應(yīng)用性能分析工具. 從之前的介紹文章中可以了解到 TMAM 本質(zhì)上是對(duì) CPU Performance Counter 的整理和加工. 取得 Performance Counter 的讀數(shù)需要 perf 來協(xié)助, 對(duì)讀數(shù)的計(jì)算進(jìn)而明確是 Frondend bound 還是 Backend bound 等等.

    在最終計(jì)算之前, 你大概需要做三件事:

  • 明確 CPU 型號(hào), 因?yàn)椴煌?CPU, 對(duì)應(yīng)的 PMU 也不一樣
  • 讀取 TMAM 需要的 perf event 讀數(shù)
  • 按 TMAM 規(guī)定的算法計(jì)算, 具體算法在這個(gè) Excel 表格里
  • 這三步可以自動(dòng)化地由程序來做. 本質(zhì)上 toplev 就是在做這件事.

    toplev的Github地址: https://github.com/andikleen/pmu-tools

    另外補(bǔ)充一下, TMAM作為一種Top-down方法, 它一定是分級(jí)的. 通過上一級(jí)的結(jié)果下鉆, 最終定位性能瓶頸. 那么toplev在執(zhí)行的時(shí)候, 也一定是包含這個(gè)“等級(jí)”概念的.

    下面是 toplev 使用方法的資料:

    toplev manual

    pmu-tools, part II: toplev

    基本上都是由 toplev 的開發(fā)者自己寫的, 可以作為一個(gè) Quick Start Guide.

    首先可以進(jìn)行 L1 級(jí)別的檢查

    $ 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

    接著進(jìn)行 level2/level3 級(jí)別的檢查, 最大支持到 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.out

    toplev 工具是基于 perf 等工具進(jìn)行采樣的, 因此多數(shù)這些工作支持的行為, toplev 也是支持的.

    • 默認(rèn)情況下, toplev 同時(shí)測(cè)量內(nèi)核和用戶代碼. 如果只對(duì)用戶代碼感興趣, 則可以使用 --user 選項(xiàng). 這往往會(huì)減少測(cè)量噪聲, 因?yàn)橹袛啾贿^濾掉了. 還有一個(gè) --kernel 選項(xiàng)用來測(cè)量內(nèi)核代碼.

    • 在具有多個(gè)階段的復(fù)雜工作負(fù)載上, 測(cè)量間隔也是有用的. 這可以用 -I xxxi 選項(xiàng)指定, xxx 是間隔的毫秒數(shù). perf 要求時(shí)間間隔至少需要 100ms. toplev 將輸出每個(gè)間隔的測(cè)量值. 這往往會(huì)產(chǎn)生大量的數(shù)據(jù), 所以繪制輸出很有必要.

    更多詳細(xì)信息可以參照 topdev 的 help 幫助文檔.

    4 參考資料


    Top-Down performance analysis methodology


    • 本作品/博文 ( AderStep-紫夜闌珊-青伶巷草 Copyright ?2013-2017 ), 由 成堅(jiān)(gatieme) 創(chuàng)作.

    • 采用知識(shí)共享署名-非商業(yè)性使用-相同方式共享 4.0 國際許可協(xié)議進(jìn)行許可. 歡迎轉(zhuǎn)載、使用、重新發(fā)布, 但務(wù)必保留文章署名成堅(jiān)gatieme ( 包含鏈接: http://blog.csdn.net/gatieme ), 不得用于商業(yè)目的.

    • 基于本文修改后的作品務(wù)必以相同的許可發(fā)布. 如有任何疑問, 請(qǐng)與我聯(lián)系.

    總結(jié)

    以上是生活随笔為你收集整理的Intel CPU 上使用 pmu-tools 进行 TopDown 分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。