CPU分析BPF工具有哪些?

可用于CPU分析的BPF工具,見下圖標(biāo)注的這些命令

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)綏寧,10多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

CPU分析BPF工具有哪些?

下表的這些工具有些是屬于BCC或者bpftrace,或?yàn)檫@本書創(chuàng)建的。一些工具同時(shí)出現(xiàn)在BCC和bpftrace中。下表出了本節(jié)介紹的工具的來源(BT是bpftrace的縮寫。)

 

Tool

工具名稱

Source

來源

Target

功效/目標(biāo)

Description

描述

execsnoop

BCC/BT

Sched

Lists new   process execution

列出新進(jìn)程的執(zhí)行

exitsnoop

BCC

Sched

Shows process   lifespan and exit reason

顯示進(jìn)程壽命和退出原因

runqlat

BCC/BT

Sched

Summarizes CPU   run queue latency

總結(jié)CPU運(yùn)行隊(duì)列延遲情況

runqlen

BCC/BT

Sched

Summarizes CPU   run queue length

總結(jié)CPU運(yùn)行隊(duì)列長(zhǎng)度

runqslower

BCC

Sched

Prints run   queue waits slower than a threshold

打印等待時(shí)間慢于閾值的運(yùn)行隊(duì)列(單位us)

cpudist

BCC

Sched

Summarizes   on-CPU time

匯總on-CPU的時(shí)間

cpufreq

Book

CPUs

Samples CPU   frequency by process

按進(jìn)程采樣CPU頻率

profile

BCC

CPUs

Samples CPU   stack traces

采樣CPU堆棧跟蹤

offcputime

BCC/book

Sched

Summarizes   off-CPU stack traces and times

匯總off-CPU堆棧跟蹤和時(shí)間

syscount

BCC/BT

Syscalls

Counts system   calls by type and process

按類型和過程統(tǒng)計(jì)syscall系統(tǒng)調(diào)用

argdist

BCC

Syscalls

Can be used   for syscall analysis

可以用于系統(tǒng)調(diào)用分析

trace

BCC

Syscalls

Can be used   for syscall analysis

可以用于系統(tǒng)調(diào)用分析

funccount

BCC

Software

Counts   function calls

計(jì)算函數(shù)調(diào)用

softirqs

BCC

Interrupts

Summarizes   soft interrupt time

匯總軟中斷時(shí)間

hardirqs

BCC

Interrupts

Summarizes   hard interrupt time

匯總硬中斷時(shí)間

smpcalls

Book

Kernel

Times SMP   remote CPU calls

統(tǒng)計(jì)SMP遠(yuǎn)程CPU調(diào)用的時(shí)間

llcstat

BCC

PMCs

Summarizes LLC   hit ratio by process

按進(jìn)程匯總LLC命中率

execsnoop

通過exec() syscall系統(tǒng)調(diào)用來跟蹤新進(jìn)程。

可以發(fā)現(xiàn)消耗CPU資源的短暫進(jìn)程的問題,還可以用于調(diào)試軟件的執(zhí)行,包括應(yīng)用程序啟動(dòng)腳本。

該工具捕獲了用戶使用SSH登錄系統(tǒng)并啟動(dòng)了包括sshd、groups、mesg在內(nèi)的進(jìn)程的瞬間。它還顯示了來自系統(tǒng)活動(dòng)記錄器sar的過程,包括將指標(biāo)寫入其日志,包括sa1和sadc。

 

我們可以使用execsnoop查找消耗資源的高速率的短期進(jìn)程,通常它們可能運(yùn)行時(shí)間很短很難通過top之類的來發(fā)現(xiàn),但是使用execsnoop很容易發(fā)現(xiàn)它。

execsnoop已用于調(diào)試許多生產(chǎn)問題,例如:來自后臺(tái)作業(yè)的干擾,應(yīng)用程序啟動(dòng)緩慢或失敗,容器啟動(dòng)緩慢或失敗,等等。

 

execsnoop的工作原理:

跟蹤execve系統(tǒng)調(diào)用(常用的exec(2)變體),并顯示execve(2)參數(shù)和返回值的詳細(xì)信息。這將捕獲遵循fork(2)/clone(2)-> exec(2)順序的新進(jìn)程,以及 re-exec(2)的進(jìn)程。

 

有個(gè)特殊情況:一些應(yīng)用程序在不調(diào)用exec(2)的情況下創(chuàng)建新進(jìn)程,例如,在使用fork(2)或單獨(dú)克隆(2)創(chuàng)建工作進(jìn)程池時(shí)。因?yàn)樗鼈儾徽{(diào)用execve(2),所以execsnoop輸出中不包括這些。這種情況應(yīng)該不常見:應(yīng)用程序應(yīng)該創(chuàng)建工作線程池,而不是進(jìn)程。 【舉例子: 我們登錄到redis-cli后再執(zhí)行的其它的命令,execsnoop就無法抓取到】

 

由于進(jìn)程執(zhí)行速率預(yù)計(jì)相對(duì)較低(<1000/秒),因此該工具的開銷可以忽略不計(jì)。

 

這里再介紹一個(gè)來自Netflix的一個(gè)真實(shí)問題,我使用execnoop進(jìn)行了調(diào)試。這發(fā)生在一個(gè)用于微基準(zhǔn)測(cè)試的服務(wù)器上,但是基準(zhǔn)測(cè)試結(jié)果顯示出太多的差異是不可信任的。當(dāng)系統(tǒng)被認(rèn)為是空閑的時(shí)候,我運(yùn)行了execnoop,發(fā)現(xiàn)它不是!這些程序每啟動(dòng)一秒鐘,就會(huì)擾亂我們的基準(zhǔn)。結(jié)果發(fā)現(xiàn),這是一個(gè)配置錯(cuò)誤的服務(wù),它試圖每秒鐘啟動(dòng)一次,失敗,然后重新啟動(dòng)。一旦服務(wù)被停用,這些進(jìn)程就停止了(正如使用execnoop所確認(rèn)的那樣),然后基準(zhǔn)數(shù)就變得一致了。

 

 

 

?  execsnoop --help

usage: execsnoop [-h] [-T] [-t] [-x] [-q] [-n NAME] [-l LINE]

                 [--max-args MAX_ARGS]

 

Trace exec() syscalls

 

optional arguments:

  -h, --help            show this help message and exit

  -T, --time            include time column on output (HH:MM:SS)

  -t, --timestamp       include timestamp on output

  -x, --fails           include failed exec()s

  -q, --quote           Add quotemarks (") around arguments.

  -n NAME, --name NAME  only print commands matching this name (regex), any arg

  -l LINE, --line LINE  only print commands where arg contains this line (regex)

  --max-args MAX_ARGS   maximum number of arguments parsed and displayed,defaults to 20

 

examples:

    ./execsnoop           # trace all exec() syscalls

    ./execsnoop -x        # include failed exec()s

    ./execsnoop -T        # include time (HH:MM:SS)

    ./execsnoop -t        # include timestamps

    ./execsnoop -q        # add "quotemarks" around arguments

    ./execsnoop -n main   # only print command lines containing "main"

    ./execsnoop -l tpkg   # only print command where arguments contains "tpkg"

 

 

exitsnoop

exitsnoop是一個(gè)BCC工具,可跟蹤進(jìn)程退出的時(shí)間,顯示進(jìn)程的使用期限和退出原因。期限是從進(jìn)程創(chuàng)建到終止的時(shí)間,并且包括CPU的開啟和關(guān)閉時(shí)間。

像execsnoop一樣,exitsnoop可以幫助調(diào)試短期進(jìn)程的問題,并提供不同的信息來幫助理解此類工作負(fù)載。例如:

 

CPU分析BPF工具有哪些?

 

此輸出顯示退出了許多短期進(jìn)程,例如cmake,sh和make,這表明一個(gè)軟件版本正在運(yùn)行。1.00秒后,sleep進(jìn)程成功退出(退出代碼0),而由于KILL信號(hào),另一個(gè)sleep進(jìn)程在7.31秒后退出。這也捕獲了221.25秒后退出的“ DOM Worker”線程。

 

該工具通過檢測(cè) sched:sched_process_exit 跟蹤點(diǎn)及其參數(shù)來工作,并且還使用bpf_get_current_task(),以便可以從任務(wù)結(jié)構(gòu)中讀取開始時(shí)間(不穩(wěn)定的接口詳細(xì)信息)。由于此跟蹤點(diǎn)很少觸發(fā),因此該工具的開銷可以忽略不計(jì)。

 

本人的實(shí)戰(zhàn)截圖:

CPU分析BPF工具有哪些?

runqlat

runqlat是一個(gè)BCC和bpftrace工具,用于測(cè)量CPU調(diào)度程序延遲,通常稱為運(yùn)行隊(duì)列延遲(即使不再使用運(yùn)行隊(duì)列實(shí)現(xiàn))。這對(duì)于識(shí)別和量化CPU飽和問題很有用,在CPU飽和問題中,對(duì)CPU資源的需求超出了服務(wù)能力。runqlat度量的指標(biāo)是每個(gè)線程(任務(wù))等待其打開CPU所花費(fèi)的時(shí)間。

 

下圖顯示了在48核CPU生產(chǎn)API實(shí)例上運(yùn)行的BCC runqlat在系統(tǒng)范圍內(nèi)的CPU利用率約為42%(可以用top命令查看到CPU的利用率)。runqlat的參數(shù)為10 1,表示以設(shè)置10秒間隔,僅輸出一次:

CPU分析BPF工具有哪些?

此輸出表明,在大多數(shù)情況下,線程等待的時(shí)間少于15微秒,直方圖中的模式介于2到15微秒之間。這是相對(duì)較快的(健康系統(tǒng)的一個(gè)示例),并且對(duì)于運(yùn)行在42%CPU利用率上的系統(tǒng)來說是預(yù)期的。在此示例中,有時(shí)運(yùn)行隊(duì)列延遲高達(dá)8到16毫秒存儲(chǔ)桶,但這些異常值是異常的。

 

runqlat的原理:

通過檢測(cè)調(diào)度程序喚醒和上下文切換事件來確定從喚醒到運(yùn)行的時(shí)間。注意: 這些事件在繁忙的生產(chǎn)系統(tǒng)上可能非常頻繁,每秒超過一百萬個(gè)事件。即使對(duì)BPF進(jìn)行了優(yōu)化,以這些速率,即使每個(gè)事件增加一微秒也會(huì)導(dǎo)致明顯的開銷。需要小心使用runqlat這個(gè)工具。

示例:如果您在一個(gè)10核的系統(tǒng)上的上下文切換速率為1M/sec,則每個(gè)上下文切換增加1微秒將消耗10%的CPU資源(計(jì)算方法: 100%×(1×1000000/10×1000000) )。有關(guān)BPF開銷的一些實(shí)際測(cè)量值,請(qǐng)參見第18章,每個(gè)事件通常小于一微秒。

一個(gè)使用runqlat診斷案例

在一個(gè)36核CPU的構(gòu)建服務(wù)器進(jìn)行軟件構(gòu)建操作,其中并行作業(yè)的數(shù)量被錯(cuò)誤地設(shè)置為72,從而導(dǎo)致CPU超載。觀測(cè)到的截圖如下:

CPU分析BPF工具有哪些?

現(xiàn)在的分布是三模態(tài),最慢的模式以8到16毫秒的桶為中心.這顯示了線程的大量等待(小于15微秒內(nèi)算健康指標(biāo))。

CPU分析BPF工具有哪些?

可以直接從其他工具和指標(biāo)中識(shí)別出此特定問題。例如,sar可以顯示CPU利用率(-u)和運(yùn)行隊(duì)列指標(biāo)(-q)

CPU分析BPF工具有哪些?

可以看到,當(dāng)前系統(tǒng) CPU idle空閑為0, 全負(fù)荷工作。 另外, runq-sz平均運(yùn)行隊(duì)列大小為72(包括正在運(yùn)行和可運(yùn)行),也大幅超過了可用的36個(gè)CPU。

runqlen

runqlen是一個(gè)BCC和bpftrace工具,用于對(duì)CPU運(yùn)行隊(duì)列的長(zhǎng)度進(jìn)行采樣,計(jì)算有多少任務(wù)在等待輪到他們,并將其顯示為線性直方圖。這可以用來進(jìn)一步描述運(yùn)行隊(duì)列延遲的問題或作為更便宜的近似值。

 

下圖顯示了在48個(gè)CPU生產(chǎn)API實(shí)例上運(yùn)行的BCC的runqlet,該實(shí)例在系統(tǒng)范圍內(nèi)的CPU利用率約為42%(與先前在runqlat中顯示的實(shí)例相同)。runqlen的參數(shù)為 10 1,以設(shè)置10秒間隔,僅輸出一次:

CPU分析BPF工具有哪些?

這表明在大多數(shù)情況下,運(yùn)行隊(duì)列長(zhǎng)度為零,這意味著線程無需等待輪到他們。

 

我將運(yùn)行隊(duì)列長(zhǎng)度描述為輔助性能指標(biāo),將運(yùn)行隊(duì)列延遲描述為主要性能。與長(zhǎng)度不同,延遲會(huì)直接和成比例地影響性能。想象一下在雜貨店加入結(jié)帳行。對(duì)您來說更重要的是:線路的長(zhǎng)度或您實(shí)際花費(fèi)的等待時(shí)間?runqlat更重要。那么,為什么要使用runqlen?

 

首先,可以使用runqlen進(jìn)一步描述在runqlat中發(fā)現(xiàn)的問題,并解釋延遲如何變高。其次,runqlen采用99赫茲的定時(shí)采樣,而runqlat跟蹤調(diào)度程序事件。與runqlat的調(diào)度程序跟蹤相比,此定時(shí)采樣的開銷可忽略不計(jì)。對(duì)于24x7全天候監(jiān)控,最好先使用runqlen來識(shí)別問題(因?yàn)檫\(yùn)行起來更便宜),然后再使用runqlat臨時(shí)量化延遲。

四線程,一個(gè)CPU的一個(gè)示例:

在此示例中,將四個(gè)繁忙線程的CPU工作負(fù)載綁定到CPU0。執(zhí)行runqlen -C以顯示每個(gè)CPU的直方圖:

CPU分析BPF工具有哪些?

CPU 0上的運(yùn)行隊(duì)列長(zhǎng)度為三個(gè):一個(gè)線程在CPU上等待三個(gè)線程。此每個(gè)CPU的輸出對(duì)于檢查調(diào)度程序平衡非常有用。

 

 

小實(shí)驗(yàn):

我們執(zhí)行5次這個(gè)單行命令taskset -c 0 sh -c 'while :; do :; done' &,這個(gè)循環(huán)操作綁定在cpu0上運(yùn)行,然后執(zhí)行 runqlen可以看到如下結(jié)果,明顯可以看到cpu0上有很多運(yùn)行隊(duì)列的堆積,而cpu1上堆積基本都是0。

CPU分析BPF工具有哪些?

runqslower

runqslower是一個(gè)BCC工具,它列出了運(yùn)行隊(duì)列等待時(shí)間超過可配置閾值的實(shí)例,并顯示了遭受等待時(shí)間及其持續(xù)時(shí)間的過程。

 

以下示例來自當(dāng)前在系統(tǒng)范圍內(nèi)以45%CPU利用率運(yùn)行的48 CPU生產(chǎn)API實(shí)例:

CPU分析BPF工具有哪些?

此輸出表明,在13秒的時(shí)間內(nèi),  有10個(gè)運(yùn)行隊(duì)列等待時(shí)間超過默認(rèn)閾值10000微秒(10毫秒)的情況。對(duì)于具有55%空閑CPU余量的服務(wù)器來說,這似乎令人驚訝,但這是一個(gè)繁忙的多線程應(yīng)用程序,在調(diào)度程序可以將線程遷移到空閑CPU之前,運(yùn)行隊(duì)列可能不平衡。該工具可以確認(rèn)受影響的應(yīng)用程序。

 

該工具當(dāng)前通過將kprobes用于內(nèi)核函數(shù)ttwu_do_wakeup(),wake_up_new_task()和finish_task_switch()來工作。將來的版本應(yīng)使用類似于runqlat的bpftrace版本的代碼切換到調(diào)度程序跟蹤點(diǎn)。開銷與runqlat相似;由于kprobes的成本,即使在runqslower不輸出任何輸出的情況下,它也會(huì)在繁忙的系統(tǒng)上引起明顯的開銷。

cpudist

cpudist是一個(gè)BCC工具,用于顯示每個(gè)線程喚醒的CPU時(shí)間分布。這可用于幫助表征CPU工作負(fù)載,為以后的調(diào)整和設(shè)計(jì)決策提供詳細(xì)信息。

例如,從一個(gè)48核CPU生產(chǎn)實(shí)例中:

CPU分析BPF工具有哪些?

此輸出表明生產(chǎn)應(yīng)用程序通常僅在CPU上花費(fèi)很短的時(shí)間:從0到127微秒。

 

下面的圖,這是一個(gè)CPU繁重的工作負(fù)載,具有比可用CPU更多的繁忙線程,并且具有以毫秒(-m)為單位的直方圖:

CPU分析BPF工具有哪些?

現(xiàn)在有一種CPU持續(xù)時(shí)間從4到15毫秒的模式:這很可能是線程耗盡了調(diào)度程序的時(shí)間量,然后遇到了非自愿的上下文切換。

 

該工具用于幫助了解Netflix的生產(chǎn)變化,其中機(jī)器學(xué)習(xí)應(yīng)用程序開始運(yùn)行的速度快了三倍。perf命令用于顯示上下文切換速率已降低,而cpudist用于解釋其影響:應(yīng)用程序現(xiàn)在通常在上下文切換之間運(yùn)行兩到四毫秒,而更早的時(shí)候只能在0到3微秒之間運(yùn)行,然后再被上下文切換中斷。

 

注意:

cpudist通過跟蹤調(diào)度程序上下文切換事件來工作,該事件在繁忙的生產(chǎn)工作負(fù)載上非常頻繁(超過一百萬個(gè)事件/秒)。與runqlat一樣,此工具的開銷可能很大,因此請(qǐng)謹(jǐn)慎使用。

root@dba-test:~|?  cpudist --help

usage: cpudist [-h] [-O] [-T] [-m] [-P] [-L] [-p PID] [interval] [count]

 

Summarize on-CPU time per task as a histogram.

 

positional arguments:

  interval            output interval, in seconds

  count               number of outputs

 

optional arguments:

  -h, --help          show this help message and exit

  -O, --offcpu        measure off-CPU time   #只顯示CPU以外的時(shí)間,而不是CPU上的時(shí)間

  -T, --timestamp     include timestamp on output

  -m, --milliseconds  millisecond histogram

  -P, --pids          print a histogram per process ID  #每個(gè)進(jìn)程打印一個(gè)直方圖

  -L, --tids          print a histogram per thread ID

  -p PID, --pid PID   trace this PID only

 

examples:

    cpudist              # summarize on-CPU time as a histogram

    cpudist -O           # summarize off-CPU time as a histogram

    cpudist 1 10         # print 1 second summaries, 10 times

    cpudist -mT 1        # 1s summaries, milliseconds, and timestamps

    cpudist -P           # show each PID separately

    cpudist -p 185       # trace PID 185 only

cpufreq

這是個(gè)bpftrace腳本文件,不在BCC工具集內(nèi)。 個(gè)人認(rèn)為只要大致了解下這個(gè)命令即可。

 

cpufreq對(duì)CPU頻率進(jìn)行采樣,并將其顯示為系統(tǒng)范圍的直方圖,并帶有每個(gè)進(jìn)程的名稱直方圖。這僅適用于更改頻率的CPU縮放調(diào)節(jié)器,例如節(jié)電,并可用于確定應(yīng)用程序運(yùn)行的時(shí)鐘速度。

profile

profile是一個(gè)BCC工具,它以一定的時(shí)間間隔對(duì)堆棧跟蹤進(jìn)行采樣,并報(bào)告堆棧跟蹤的頻率計(jì)數(shù)。這是BCC中了解CPU消耗的最有用的工具,因?yàn)樗偨Y(jié)了消耗CPU資源的幾乎所有代碼路徑。由于事件率固定為可以調(diào)整的采樣率,因此它也可以以相對(duì)可忽略的開銷使用。

根據(jù)profile的結(jié)果,我們可以繪制火焰圖

$ profile -af 30 > out.stacks01

$ git clone https://github.com/brendangregg/FlameGraph

$ cd FlameGraph

$ ./flamegraph.pl --color=java < ../out.stacks01 > out.svg

然后即可輸出一幅火焰圖。


使profile與其他CPU探查器不同的原因在于,為了提高效率,此頻率計(jì)數(shù)是在內(nèi)核空間中計(jì)算的。其他基于內(nèi)核的探查器,例如perf,會(huì)將每個(gè)采樣的堆棧跟蹤發(fā)送到用戶空間,在該用戶跟蹤中將其后處理為摘要。這可能會(huì)占用大量CPU資源,并且取決于調(diào)用,它還可能涉及文件系統(tǒng)和磁盤I/O來記錄樣本。profile避免了這些費(fèi)用。

root@dba-test:~|? profile --help

usage: profile [-h] [-p PID | -L TID] [-U | -K] [-F FREQUENCY | -c COUNT] [-d]

               [-a] [-I] [-f] [--stack-storage-size STACK_STORAGE_SIZE]

               [-C CPU]

               [duration]

 

Profile CPU stack traces at a timed interval

 

positional arguments:

  duration              duration of trace, in seconds

 

optional arguments:

  -h, --help            show this help message and exit

  -p PID, --pid PID     profile process with this PID only

  -L TID, --tid TID     profile thread with this TID only

  -U, --user-stacks-only    show stacks from user space only (no kernel space stacks)

  -K, --kernel-stacks-only   show stacks from kernel space only (no user space stacks)

  -F FREQUENCY, --frequency FREQUENCY     sample frequency, Hertz

  -c COUNT, --count COUNT  sample period, number of events

  -d, --delimited       insert delimiter between kernel/user stacks

  -a, --annotations     add _[k] annotations to kernel frames

  -I, --include-idle    include CPU idle stacks

  -f, --folded          output folded format, one line per stack (for flame graphs)

  --stack-storage-size STACK_STORAGE_SIZE

                        the number of unique stack traces that can be stored and displayed (default 16384)

  -C CPU, --cpu CPU     cpu number to run profile on

 

examples:

    ./profile             # profile stack traces at 49 Hertz until Ctrl-C

    ./profile -F 99       # profile stack traces at 99 Hertz

    ./profile -c 1000000  # profile stack traces every 1 in a million events

    ./profile 5           # profile at 49 Hertz for 5 seconds only

    ./profile -f 5        # output in folded format for flame graphs

    ./profile -p 185      # only profile process with PID 185

    ./profile -L 185      # only profile thread with TID 185

    ./profile -U          # only show user space stacks (no kernel)

    ./profile -K          # only show kernel space stacks (no user)

offcputime

offcputime是一個(gè)BCC和bpftrace工具,用于總結(jié)阻塞線程和關(guān)閉CPU所花費(fèi)的時(shí)間,并顯示堆棧跟蹤信息以說明原因。

對(duì)于CPU分析,此工具說明了為什么線程未在CPU上運(yùn)行。

與profile對(duì)應(yīng);在它們之間,它們顯示了線程在系統(tǒng)上花費(fèi)的全部時(shí)間:使用profile的CPU時(shí)間和使用offcputime的CPU時(shí)間。

offcputime已用于查找各種生產(chǎn)問題,包括查找在鎖獲取中阻塞的意外時(shí)間以及負(fù)責(zé)的堆棧跟蹤。

注意:

offcputime通過檢測(cè)上下文切換并記錄從線程離開CPU到返回CPU的時(shí)間以及堆棧跟蹤來工作。為了提高效率,在內(nèi)核上下文中對(duì)時(shí)間和堆棧跟蹤進(jìn)行了頻率計(jì)數(shù)。但是,上下文切換事件可能會(huì)非常頻繁,并且對(duì)于繁忙的生產(chǎn)工作負(fù)載,此工具的開銷可能會(huì)變得非常大(例如,> 10%)。該工具最好只在短時(shí)間內(nèi)運(yùn)行,以最大程度地減少生產(chǎn)影響。

offCPU time火焰圖

與profile一樣,offcputime的輸出可能非常冗長(zhǎng),以至于您可以發(fā)現(xiàn)最好將它作為火焰圖進(jìn)行檢查??梢詫ffcputime可視化為非CPU時(shí)間火焰圖。

 

相關(guān)繪圖的命令如下:

# offcputime -fKu 5 > out.offcputime01.txt

$ flamegraph.pl --hash --bgcolors=blue --title="Off-CPU Time Flame Graph" < out.offcputime01.txt > out.offcputime01.svg

funccount

funccount是一種BCC工具,可以對(duì)函數(shù)和其他事件進(jìn)行頻率計(jì)數(shù)。

它可用于為軟件CPU使用情況提供更多上下文,顯示調(diào)用哪些函數(shù)以及調(diào)用頻率。profile可能能夠顯示某個(gè)功能在CPU上很熱,但無法解釋為什么:該功能是否運(yùn)行緩慢,或者每秒是否被簡(jiǎn)單調(diào)用了數(shù)百萬次。

 

TIPS:profile不能輕易解釋這一點(diǎn)。包括profile在內(nèi)的探查器對(duì)CPU指令指針進(jìn)行采樣,因此與該函數(shù)的反匯編進(jìn)行比較可能會(huì)顯示該函數(shù)是卡在循環(huán)中還是被調(diào)用多次。

 

例如,通過匹配以 tcp_開頭的功能,可以對(duì)繁忙的生產(chǎn)實(shí)例上的內(nèi)核TCP功能進(jìn)行頻率計(jì)數(shù):

CPU分析BPF工具有哪些?

可以使用-i 1使其每1秒輸出一次。例如,較早的profile輸出顯示函數(shù)get_page_from_freelist()在CPU上很熱。是因?yàn)樗?jīng)常被調(diào)用還是因?yàn)樗\(yùn)行緩慢?可以用如下命令來測(cè)量其每秒速率:

CPU分析BPF工具有哪些?

這通過使用函數(shù)的動(dòng)態(tài)跟蹤來進(jìn)行:內(nèi)核函數(shù)使用kprobes,用戶級(jí)函數(shù)使用uprob。此工具的開銷與功能的速率有關(guān)。某些函數(shù)(例如malloc()和get_page_from_freelist() )往往會(huì)頻繁發(fā)生,因此對(duì)其進(jìn)行跟蹤可能會(huì)大大降低目標(biāo)應(yīng)用程序的速度,超過10%,請(qǐng)謹(jǐn)慎使用。

softirqs

softirqs是一個(gè)BCC工具,它顯示了花費(fèi)在soft IRQ(軟中斷)所花費(fèi)的時(shí)間。

可以通過不同的工具輕松獲得系統(tǒng)范圍的軟中斷時(shí)間。例如,mpstat將其顯示為%soft。也有 /proc/softirqs顯示軟IRQ事件的計(jì)數(shù)。

BCC softirqs工具的不同之處在于,它可以顯示每個(gè)軟IRQ的時(shí)間,而不是事件計(jì)數(shù)。

 

例如,從一個(gè)48 CPU生產(chǎn)實(shí)例和一個(gè)10秒的跟蹤中:

CPU分析BPF工具有哪些?

此輸出顯示,花費(fèi)在net_rx花費(fèi)的時(shí)間最多,總計(jì)1358毫秒。這很重要,因?yàn)樵谠?8 CPU系統(tǒng)上,它占CPU時(shí)間的3%。

 

softirqs通過使用irq:softirq_enter和irq:softirq_exit跟蹤點(diǎn)來工作。該工具的開銷與事件發(fā)生率有關(guān),這對(duì)于繁忙的生產(chǎn)系統(tǒng)和較高的網(wǎng)絡(luò)數(shù)據(jù)包發(fā)生率可能會(huì)很高。謹(jǐn)慎使用并檢查開銷。

hardirqs

hardirqs是一個(gè)BCC工具,它顯示了花費(fèi)在hard IRQ(硬中斷)所花費(fèi)的時(shí)間。

硬中斷中的系統(tǒng)級(jí)時(shí)間可以從其他工具輕松獲得。例如,mpstat將其顯示為%irq。也有 /proc/interrupts顯示hard IRQ事件的計(jì)數(shù)。

 

BCC hardirqs工具的不同之處在于,它可以顯示每個(gè)硬IRQ的時(shí)間,而不是事件計(jì)數(shù)。

下面是mpstat -P ALL 1的部分截圖(這臺(tái)ecs的負(fù)載很低)

CPU分析BPF工具有哪些?

hardirqs可以提供CPU分析器不可見的CPU使用情況信息。有關(guān)缺少硬件PMU的云實(shí)例的性能分析,請(qǐng)參見第6.2.4節(jié)的內(nèi)部部分。

CPU分析BPF工具有哪些?


文章標(biāo)題:CPU分析BPF工具有哪些?
標(biāo)題來源:http://muchs.cn/article44/ishdhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、ChatGPT、服務(wù)器托管、做網(wǎng)站搜索引擎優(yōu)化、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁(yè)設(shè)計(jì)公司