提起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了
我们想看一下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或者要发送切换时,记录一下当前的堆栈和时间,当切换回来的时候再次记录下堆栈和时间即可。
八年砥砺奋斗 中智盛安助力智慧消防安全事业蓬勃发展
智能手机快速成长_台积电连续7年创营收记录
工程机械前三季度景气“升温” 业内:万亿国债提振基建,明年释放需求红利
实用门铃电路图
插件瞬变电压抑制二极管(TVS)
基于linux eBPF的进程off-cpu的方法
中国绿色能源程度超过世界平均,是全球发电量最多的国家
浩康科技联同Velosti发表USB3.0高速AES/UCA硬件加密优盘方案
区块链如何成为汽车产业的中坚力量
高速通信PCB的过孔优化解决方案
PC电源分析
7/8航空插头电控柜通讯模块5针焊板式防水插座
绷带阻水性测试仪的技术特征以及技术参数
智能彩灯五路产品原型的代码实现(三明治开发板+Arduino,Wi-Fi)
必要商城:C2M模式正式启动,成为平台成功的秘诀
变压器差动保护不平衡电流的产生原因及解决办法
运算放大器LM741内部电路详解+工作原理+功能参数
测试开发工程师的发展方向
如何画三相桥式全控整流电路?
魅族X8评测 供货才是关键