提起off-CPU就不得不提on-cpu,on-cpu是在線程(進(jìn)程)在CPU上運(yùn)行的消耗,off-cpu就是進(jìn)程(線程)由于某種原因阻塞的消耗,如等待IO,等待鎖,等待定時(shí)器,等待內(nèi)存頁(yè)面的swap等。如下圖所示,紅色部分屬于on-cpu部分,藍(lán)色部分屬于off-cpu。
一般我們用的perf命令等都是采樣on-cpu的指令進(jìn)行CPU的消耗分析的,這篇文章主要介紹一下分析進(jìn)程off-cpu的方法。
要想風(fēng)險(xiǎn)一個(gè)進(jìn)程的off-cpu消耗,首先就是要確保程序編譯時(shí)有完整的堆棧信息。例如有些C程序?yàn)榱藘?yōu)化性能添加了gcc的-fomit-frame-pointer編譯選項(xiàng),這就導(dǎo)致程序中不再有堆棧信息,對(duì)于這種情況是無(wú)法分析出off-cpu的堆棧消耗的。
這里講的分析off-cpu的工具是基于linux eBPF的offcputime(要求linux內(nèi)核版本在4.8以上),當(dāng)然使用perf sched timehist工具也可以(linux內(nèi)核版本大于4.10),但是開銷要大一些。我們首先yum安裝bpfcc-tools(tools for BPF Compiler Collection),以及git clone了
我們想看一下pgrep -nx tar命令的off-cpu執(zhí)行消耗可以使用如下命令。
如果我們只想查看內(nèi)核態(tài)的off-cpu消耗可以加上-K參數(shù)。如果想把TASK_UNINTERRUPTIBLE狀態(tài)過(guò)濾掉可以添加--state 2,其中TASK_RUNNING狀態(tài)為0, TASK_INTERRUPTIBLE狀態(tài)為1 TASK_UNINTERRUPTIBLE狀態(tài)為2。
當(dāng)然也可以查看off-cpu的火焰圖,如下方式
sudo offcputime-bpfcc -df -p `pgrep -nx a.out` 30 > out.stacks
./flamegraph.pl --color=io --title="Off-CPU Time Flame Graph" --countname=us~/out.stacks > output.svg
打開output.svg圖片即可。
然后我們?cè)賮?lái)講一下off-cpu的原理。當(dāng)進(jìn)程由于某種原因block或者要發(fā)送切換時(shí),記錄一下當(dāng)前的堆棧和時(shí)間,當(dāng)切換回來(lái)的時(shí)候再次記錄下堆棧和時(shí)間即可。
編輯:hfy
-
cpu
+關(guān)注
關(guān)注
68文章
11079瀏覽量
217035 -
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213756 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3298瀏覽量
118896 -
線程
+關(guān)注
關(guān)注
0文章
508瀏覽量
20208
發(fā)布評(píng)論請(qǐng)先 登錄
Linux進(jìn)程怎么綁定CPU
實(shí)戰(zhàn)eBPF kprobe函數(shù)插樁
Linux進(jìn)程的睡眠和喚醒
干貨分享:基于嵌入式Linux中進(jìn)程調(diào)度實(shí)現(xiàn)方法
openEuler 倡議建立 eBPF 軟件發(fā)布標(biāo)準(zhǔn)
Linux進(jìn)程管理
如何使用OFF-CPU火焰圖調(diào)查分析Linux性能問(wèn)題概述
如何設(shè)置Linux進(jìn)程的睡眠和喚醒
學(xué)會(huì)Linux進(jìn)程管理的方法

Linux CPU的性能應(yīng)該如何優(yōu)化
eBPF是什么以及eBPF能干什么

linux查看端口被進(jìn)程占用的方法 Linux與windows的區(qū)別
Linux進(jìn)程間通信方法之管道

評(píng)論