可用于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
下表的這些工具有些是屬于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命中率 |
通過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是一個(gè)BCC工具,可跟蹤進(jìn)程退出的時(shí)間,顯示進(jìn)程的使用期限和退出原因。期限是從進(jìn)程創(chuàng)建到終止的時(shí)間,并且包括CPU的開啟和關(guān)閉時(shí)間。
像execsnoop一樣,exitsnoop可以幫助調(diào)試短期進(jìn)程的問題,并提供不同的信息來幫助理解此類工作負(fù)載。例如:
此輸出顯示退出了許多短期進(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)截圖:
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秒間隔,僅輸出一次:
此輸出表明,在大多數(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è)到的截圖如下:
現(xiàn)在的分布是三模態(tài),最慢的模式以8到16毫秒的桶為中心.這顯示了線程的大量等待(小于15微秒內(nèi)算健康指標(biāo))。
可以直接從其他工具和指標(biāo)中識(shí)別出此特定問題。例如,sar可以顯示CPU利用率(-u)和運(yùn)行隊(duì)列指標(biāo)(-q)
可以看到,當(dāng)前系統(tǒng) CPU idle空閑為0, 全負(fù)荷工作。 另外, runq-sz平均運(yùn)行隊(duì)列大小為72(包括正在運(yùn)行和可運(yùn)行),也大幅超過了可用的36個(gè)CPU。
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秒間隔,僅輸出一次:
這表明在大多數(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 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。
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í)例:
此輸出表明,在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是一個(gè)BCC工具,用于顯示每個(gè)線程喚醒的CPU時(shí)間分布。這可用于幫助表征CPU工作負(fù)載,為以后的調(diào)整和設(shè)計(jì)決策提供詳細(xì)信息。
例如,從一個(gè)48核CPU生產(chǎn)實(shí)例中:
此輸出表明生產(chǎn)應(yīng)用程序通常僅在CPU上花費(fèi)很短的時(shí)間:從0到127微秒。
下面的圖,這是一個(gè)CPU繁重的工作負(fù)載,具有比可用CPU更多的繁忙線程,并且具有以毫秒(-m)為單位的直方圖:
現(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
這是個(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是一個(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是一個(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是一種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ù):
可以使用-i 1使其每1秒輸出一次。例如,較早的profile輸出顯示函數(shù)get_page_from_freelist()在CPU上很熱。是因?yàn)樗?jīng)常被調(diào)用還是因?yàn)樗\(yùn)行緩慢?可以用如下命令來測(cè)量其每秒速率:
這通過使用函數(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是一個(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秒的跟蹤中:
此輸出顯示,花費(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是一個(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ù)載很低)
hardirqs可以提供CPU分析器不可見的CPU使用情況信息。有關(guān)缺少硬件PMU的云實(shí)例的性能分析,請(qǐng)參見第6.2.4節(jié)的內(nèi)部部分。
文章標(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)