Off-CPU 性能分析【轉】


轉自:http://blog.chinaunix.net/uid-28541347-id-5828248.html

Off-CPU 性能分析

提起off-CPU就不得不提on-cpu,on-cpu是在線程(進程)在CPU上運行的消耗,off-cpu就是進程(線程)由於某種原因阻塞的消耗,如等待IO,等待鎖,等待定時器,等待內存頁面的swap等。如下圖所示,紅色部分屬於on-cpu部分,藍色部分屬於off-cpu。

一般我們用的perf命令等都是采樣on-cpu的指令進行CPU的消耗分析的,這篇文章主要介紹一下分析進程off-cpu的方法。

要想風險一個進程的off-cpu消耗,首先就是要確保程序編譯時有完整的堆棧信息。例如有些C程序為了優化性能添加了gcc的 -fomit-frame-pointer編譯選項,這就導致程序中不再有堆棧信息,對於這種情況是無法分析出off-cpu的堆棧消耗的。

這里講的分析off-cpu的工具是基於linux eBPF的offcputime(要求linux內核版本在4.8以上),當然使用perf sched timehist工具也可以(linux內核版本大於4.10),但是開銷要大一些。我們首先yum安裝bpfcc-tools(tools for BPF Compiler Collection),以及git clone了

https://github.com/brendangregg/FlameGraph

我們想看一下pgrep -nx tar命令的off-cpu執行消耗可以使用如下命令。

如果我們只想查看內核態的off-cpu消耗可以加上-K參數。如果想把TASK_UNINTERRUPTIBLE狀態過濾掉可以添加--state 2,其中TASK_RUNNING 狀態為0,  TASK_INTERRUPTIBLE 狀態為1 TASK_UNINTERRUPTIBLE 狀態為2

當然也可以查看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圖片即可。

然后我們再來講一下off-cpu的原理。當進程由於某種原因block或者要發送切換時,記錄一下當前的堆棧和時間,當切換回來的時候再次記錄下堆棧和時間即可。

 

參考:

http://www.brendangregg.com/offcpuanalysis.html

https://mp.weixin.qq.com/s/7fxOJvkvrMklgMMMT47qcQ


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM