Linux之perf(2)list事件
Author:Onceday Date:2023年9月3日
漫漫長(zhǎng)路,才剛剛開(kāi)始…
全系列文章請(qǐng)查看專欄: Perf性能分析_Once_day的博客-CSDN博客。
參考文檔:
- Tutorial - Perf Wiki (kernel.org)
- perf-list(1) - Linux manual page (man7.org)
1. 概述
perf list
用于列出可用的性能事件,這些事件可以用于 perf record
和其他 perf
子命令的性能分析。性能事件包括硬件事件(如 CPU 周期、緩存未命中等)、軟件事件(如上下文切換、頁(yè)面錯(cuò)誤等)和跟蹤點(diǎn)事件(如內(nèi)核函數(shù)調(diào)用、用戶空間應(yīng)用程序的跟蹤等)。
Usage: perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|metric|metricgroup|event_glob]
-d, --desc Print extra event descriptions. --no-desc to not print.
-j, --json JSON encode events and metrics
-v, --long-desc Print longer event descriptions.
--debug Enable debugging output
--deprecated Print deprecated events.
--details Print information on the perf event names and expressions used internally by events.
--unit <PMU name>
Limit PMU or metric printing to the specified PMU.
上面是在linux kernel6.2版本的perf list幫助輸出,perf工具和linux內(nèi)核以及硬件高度綁定,因此不同的內(nèi)核版本,虛擬機(jī),硬件環(huán)境下,perf list的輸出會(huì)有較大差別。許多性能事件是否可用,需要取決于當(dāng)前硬件和軟件環(huán)境。
perf工具支持一系列可測(cè)量的事件。該工具和底層內(nèi)核接口可以測(cè)量來(lái)自不同來(lái)源的事件。例如,有些事件是純內(nèi)核計(jì)數(shù)器,在這種情況下稱為軟件事件。例如:上下文切換、小故障。
事件的另一個(gè)來(lái)源是處理器本身及其性能監(jiān)控單元(PMU)。它提供了一個(gè)事件列表來(lái)測(cè)量微體系結(jié)構(gòu)事件,如周期數(shù)、指令退役、L1緩存缺失等。這些事件被稱為PMU硬件事件或簡(jiǎn)稱硬件事件。它們因處理器類型和型號(hào)而異。
perf_events接口還提供了一組常用的硬件事件名稱。在每個(gè)處理器上,如果這些事件存在,則將它們映射到CPU提供的實(shí)際事件上,否則無(wú)法使用事件。有些令人困惑的是,這些事件也稱為硬件事件(hardware event)和硬件緩存事件(hardware cache event)。
最后,還有由內(nèi)核ftrace基礎(chǔ)設(shè)施實(shí)現(xiàn)的tracepoint事件。這些僅在2.6.3 3x和更新的內(nèi)核中可用。
PMU硬件事件是特定于CPU的,并由CPU供應(yīng)商記錄。如果鏈接到libpfm4, perf工具庫(kù)會(huì)提供一些事件的簡(jiǎn)短描述。有關(guān)Intel和AMD處理器的PMU硬件事件列表,請(qǐng)參見(jiàn):
- Intel? 64 and IA-32 Architectures Developer’s Manual: Vol. 3B
- BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors
perf list列出來(lái)的這些事件就是本機(jī)設(shè)備上受支持性能事件,后面中括號(hào)里面就是具體的事件類型,這些事件可能會(huì)非常多,不同的賬戶權(quán)限執(zhí)行的結(jié)果也會(huì)有些不同。
對(duì)于非root用戶,通常只有上下文切換的PMU事件可用。這通常只是cpu PMU中的事件、預(yù)定義的事件(如周期和指令)以及一些軟件事件。其他pmu和全局測(cè)量通常僅為root
可用。一些事件限定符,如“any”,也是root
限定符。這可以通過(guò)設(shè)置kernel.perf_event_paranoid
為-1
來(lái)修改(使用sysctl),允許非root用戶使用這些事件。為了訪問(wèn)跟蹤點(diǎn)事件,perf
需要對(duì)/sys/kernel/debug/tracing具有讀訪問(wèn)權(quán)限,即使perf_event_paranoid
處于寬松設(shè)置中也是如此。
1.1 打印指定PMU單元的事件
--unit <PMU name>
選項(xiàng)在使用 perf list
時(shí)用于將事件或指標(biāo)的輸出限制為特定的性能監(jiān)視單元(Performance Monitoring Unit,PMU)。PMU 是處理器的一個(gè)組件,它可以計(jì)數(shù)硬件事件,如執(zhí)行的指令、遭受的緩存未命中或錯(cuò)誤預(yù)測(cè)的分支。它們?yōu)閼?yīng)用程序分析提供了基礎(chǔ),可以追蹤動(dòng)態(tài)控制流并識(shí)別熱點(diǎn)。
以下是如何使用它的示例:
perf list --unit cpu
此命令將列出 CPU PMU 可用的所有事件或指標(biāo)。PMU 名稱需要事先知道,具體取決于硬件和內(nèi)核的支持。一些常見(jiàn)的 PMU 名稱包括 cpu
、cache
、bus
和 software
。
請(qǐng)記住,根據(jù)您的硬件和內(nèi)核配置,可能并非所有 PMU 都可用。
1.2 事件描述格式
--details
會(huì)額外打印符號(hào)事件(cycles, cache-misses等)的內(nèi)部表達(dá)形式,如下:
cache-misses OR cpu/cache-misses/ [Kernel PMU event]
cpu/event=0x64,umask=0x9/
cpu-cycles OR cpu/cpu-cycles/ [Kernel PMU event]
cpu/event=0x76/
事件是用它們的符號(hào)名和可選的單位掩碼和修飾符來(lái)指定的。事件名稱(Event names)、單元掩碼(unit masks)和修飾符(modifiers)不區(qū)分大小寫(xiě)。一般的情況下,可以使用cache-misses
這種符號(hào)形式來(lái)代替cpu/event=0x64,umask=0x9/
這種格式。
默認(rèn)情況下,事件是在用戶和內(nèi)核級(jí)別度量的:
perf stat -e cycles dd if=/dev/zero of=/dev/null count=100000
若要僅在用戶級(jí)別進(jìn)行度量,則需要傳遞一個(gè)修飾符(u):
perf stat -e cycles:u dd if=/dev/zero of=/dev/null count=100000
要測(cè)量用戶和內(nèi)核(顯式地):
perf stat -e cycles:uk dd if=/dev/zero of=/dev/null count=100000
事件可以通過(guò)附加冒號(hào)和一個(gè)或多個(gè)修飾符來(lái)選擇具有修飾符。修飾符允許用戶限制何時(shí)對(duì)事件進(jìn)行計(jì)數(shù)。修飾符如下:
名稱標(biāo)識(shí) | 描述 |
---|---|
u | user-space counting,用戶空間 |
k | kernel counting,內(nèi)核空間 |
h | hypervisor counting,虛擬機(jī) |
I | non idle counting,非空閑時(shí) |
G | guest counting (in KVM guests),KVM虛擬機(jī) |
H | host counting (not in KVM guests),KVM主機(jī) |
p | precise level,硬件事件精度級(jí)別 |
P | use maximum detected precise level,使用最大檢測(cè)精度水平 |
S | read sample value (PERF_SAMPLE_READ)讀取樣本值 |
D | pin the event to the PMU,將事件綁定到PMU上 |
W | 組是弱的,如果不可調(diào)度,將退回到非組 |
e | 群組或事件是排他性的,不共享PMU |
p修飾符可用于指定指令地址的精確程度。p修飾符可以被指定多次:
- 0 - SAMPLE_IP可以任意滑動(dòng)
- 1 - SAMPLE_IP必須有恒定的滑動(dòng)
- 2 - SAMPLE_IP要求有O滑塊
- 3 - SAMPLE_IP必須有0滑塊,或者使用隨機(jī)化來(lái)避免樣本副作用效果。
對(duì)于英特爾系統(tǒng),精確事件采樣是用PEBS實(shí)現(xiàn)的,它支持精確級(jí)別2,在某些特殊情況下支持精確級(jí)別3。
在AMD系統(tǒng)上,它是使用IBS實(shí)現(xiàn)的(最高精確級(jí)別到2)。精確修飾符與事件類型0x76 (cpu-cycles,CPU時(shí)鐘未停止)和0xC1(micro-ops retired)一起工作。
2. 詳細(xì)信息
2.1 perf list性能事件分類
默認(rèn)情況下,perf list列出所有的已知事件。也可以通過(guò)下面的類別來(lái)列出其中某一類事件:
事件類名稱 | 描述 |
---|---|
hw or hardware | 列出硬件事件,如cache-misses |
sw or software | 列出軟件事件,例如上下文切換(context switches) |
cache or hwcache | 列出硬件緩存事件,如L1-dcache-loads |
tracepoint | 列出所有的tracepoint事件,也可使用subsys_glob:event_glob去過(guò)濾子系統(tǒng)追蹤點(diǎn)事件,如sched、block等。 |
pmu | 打印內(nèi)核提供的PMU事件 |
sdt | 列出所有靜態(tài)定義的跟蹤點(diǎn)事件(Statically Defined Tracepoint) |
metric | 指標(biāo)列表(度量事件) |
metricgroup | 列出帶有指標(biāo)的指標(biāo)組 |
–raw-dump | 顯示所有事件的原始格式信息,該選項(xiàng)后面可以接[hw|sw|cache|tracepoint|pmu|event_glob] |
2.2 測(cè)量特定硬件上的PMU事件
本章詳細(xì)內(nèi)容可以參考文檔: perf-list(1) - Linux manual page (man7.org)
即使現(xiàn)在在perf中沒(méi)有符號(hào)形式的事件,也可以用特定于每個(gè)處理器的方式對(duì)其進(jìn)行編碼。
比如對(duì)于X86CPUs,要測(cè)量CPU硬件供應(yīng)商文檔中提供的實(shí)際PMU,可以傳遞十六進(jìn)制參數(shù)代碼:
perf stat -e r1a8 -a sleep 1
perf record -e r1a8 ...
有些處理器,比如AMD的處理器,支持大于一個(gè)字節(jié)的事件代碼和單元掩碼。在這種情況下,與事件配置參數(shù)對(duì)應(yīng)的位可以參考下面命令的結(jié)果:
cat /sys/bus/event_source/devices/cpu/format/event
比如可能的命令如下:
perf record -e r20000038f -a sleep 1
perf record -e cpu/r20000038f/ ...
perf record -e cpu/r0x20000038f/ ...
有關(guān)于特定硬件上的PMU事件,需要參考處理器的說(shuō)明文檔來(lái)確定使用方法。
在下面的路徑可以查看可用的PMUs和它們的原始參數(shù):
ls /sys/devices/*/format
一些pmu不與核心相關(guān)聯(lián),而是與整個(gè)CPU socket
相關(guān)聯(lián)。這些pmu上的事件通常不能采樣,只能使用perf stat -a
進(jìn)行全局計(jì)數(shù)。它們可以綁定到一個(gè)邏輯CPU,但是會(huì)測(cè)量同一個(gè)插槽中的所有CPU。
本例在Intel Xeon系統(tǒng)的socket 0
上的第一個(gè)內(nèi)存控制器上每秒測(cè)量?jī)?nèi)存帶寬:
perf stat -C 0 -a uncore_imc_0/cas_count_read/,uncore_imc_0/cas_count_write/ -I 1000 ...
每個(gè)內(nèi)存控制器都有自己的PMU。測(cè)量整個(gè)系統(tǒng)帶寬需要指定所有imc pmu(請(qǐng)參閱perf list output),并將這些值相加。為了簡(jiǎn)化多個(gè)事件的創(chuàng)建,在PMU名稱中支持前綴和全局匹配,并且在執(zhí)行匹配時(shí)也忽略前綴uncore_。因此,上面的命令可以通過(guò)使用以下語(yǔ)法擴(kuò)展到所有內(nèi)存控制器:
perf stat -C 0 -a imc/cas_count_read/,imc/cas_count_write/ -I 1000 ...
perf stat -C 0 -a *imc*/cas_count_read/,*imc*/cas_count_write/ -I 1000 ...
2.3 參數(shù)化的性能事件
有一些pmu事件列出來(lái)的時(shí)候,其顯示字符中帶有?
號(hào)。如下:
hv_gpci/dtbp_ptitc,phys_processor_idx=?/
這意味著當(dāng)作為事件提供時(shí),?
所指示的內(nèi)容必須也可提供。
perf stat -C 0 -e 'hv_gpci/dtbp_ptitc,phys_processor_idx=0x2/' ...
此外還有可能指定額外的事件修飾符(percore):
perf stat -e cpu/event=0,umask=0x3,percore=1/
上面命令即匯總一個(gè)核心中所有硬件線程的事件計(jì)數(shù)。
2.4 事件組測(cè)量
當(dāng)活動(dòng)事件的數(shù)量超過(guò)硬件性能計(jì)數(shù)器的數(shù)量時(shí),Perf支持基于時(shí)間的事件復(fù)用。當(dāng)工作負(fù)載更改其執(zhí)行配置文件時(shí),多路復(fù)用可能導(dǎo)致測(cè)量錯(cuò)誤。
當(dāng)使用來(lái)自事件計(jì)數(shù)的公式計(jì)算度量時(shí),確保始終將一些事件作為一個(gè)組一起測(cè)量以最小化多路錯(cuò)誤是很有用的。事件組可以使用{}
指定。
perf stat -e '{instructions,cycles}' ...
可用性能計(jì)數(shù)器的數(shù)量取決于CPU。一個(gè)組不能包含比可用計(jì)數(shù)器更多的事件。例如,Intel Core cpu通常有四個(gè)通用的核心性能計(jì)數(shù)器,加上三個(gè)固定的instructions
、cycles
和ref-cycles
計(jì)數(shù)器。一些特殊事件對(duì)它們可以調(diào)度的計(jì)數(shù)器有限制,并且可能不支持單個(gè)組中的多個(gè)實(shí)例。當(dāng)組中指定的事件太多時(shí),其中一些事件將無(wú)法測(cè)量。
全局固定事件可以限制其他組可用的計(jì)數(shù)器數(shù)量。在x86系統(tǒng)上,NMI看門(mén)狗默認(rèn)固定一個(gè)計(jì)數(shù)器。NMI看門(mén)狗可以在root用戶下禁用:
echo 0 > /proc/sys/kernel/nmi_watchdog
來(lái)自多個(gè)不同pmu的事件不能混合在一個(gè)組中,軟件事件除外。
perf還支持使用:S
說(shuō)明符進(jìn)行組領(lǐng)導(dǎo)抽樣(group leader sampling
)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-698086.html
perf record -e '{cycles,instructions}:S' ...
perf report --group
通常情況下,所有事件都在一個(gè)事件組樣本中,但是使用:S
時(shí),只有第一個(gè)事件(leader)進(jìn)行采樣,它只讀取組中其他事件的值。然而,在AUX區(qū)域事件(例如Intel PT或CoreSight)的情況下,AUX區(qū)域事件必須是先導(dǎo)事件,因此第二個(gè)事件采樣,而不是第一個(gè)事件。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-698086.html
到了這里,關(guān)于linux之perf(2)list事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!