linux终端火焰,火焰图系列之使用火焰图隐藏功能提高绘制精度
原创 红烧的威化饼 Linux阅码场 6月8日
作者简介
武汉光电国家研究中心DSAL实验室在读博士生。主要研究方向:
Linux memory and storage system, Concurrency optimization.
https://github.com/hongweiqin
由于CPU能耗优化的原因,火焰图有时并不准确。为此,我们来做一个小实验。
(还不熟悉什么是火焰图的可以看看文章末尾火焰图系列文章汇总)
1.小实验
这是一个简单C程序,其实就是一个死循环,如下:
1. #include
2. int globalv;
3. void dosth()
4. {
5. globalv++;
6. }
7. int main()
8. {
9. globalv = 0;
10. for(;;)
11. dosth();
12. return 0;
13. }
编译后可执行程序名为 func。接下来我开了两个终端,分别使用 taskset将 func运行在CPU0和CPU1上:
1. taskset 0x1 ./func
2. taskset 0x2 ./func
然后使用bcc+flamegraph绘制火焰图:
1. /bcc/profile -I -F 99 -daf 10 > out.profile
2. /mnt/sdb/FlameGraph/flamegraph.pl < out.profile > out.svg
得到的火焰图:
我的测试环境是Qemu/KVM, 32核。
我们可以看到,火焰图显示, func程序占用了近四分之一的CPU时间。但是由于我们把 func绑定在CPU0和1上执行,根据小学数学我们应该可以计算出来 func最多占用 2/32=6.25%的时间。
是不是有点不对?
2.原因
由于Linux会对CPU进行能耗优化,在低负载的时候,CPU并不是满负荷工作(降频),因此对于Idle的CPU,bcc的采样数会减少,从而导致总采样数减少。我们可以看到,我们的采样频率是99个样本/(minCPU)。运行了10s,那么总的样本数应该大约为 9910*32=31680。而实际的总采样数只有8197。分母小了,自然 func占用的CPU时间比例增加了。
3.解决办法
当然,我们可以修改CPUfreq强制让所有满负荷工作。但是这样一来麻烦,二来我的测试环境是虚拟机,修改起来更加麻烦。我们希望用一个简单的方法解决。
这就要提到flamegraph的隐藏功能了。为什么叫隐藏功能?因为如果你简单地 ./flamegraph.pl--help他不会告诉你这个用法。但是实际上他已经实现了这个功能,语法是:
1 ./flamegraph.pl --total=N < out.profile > out2.svg
其中N为用户规定的总采样数。在我们的示例中,应该是31680。这样,我们绘制出来的火焰图是这个样子的:
嗯,的确有点丑,但是6.26%才是 func真正消耗了的CPU时间比例。
4.关于CPU时间准确性的讨论
怎样才算是绘制了准确的火焰图呢?
考虑如下情形,如果CPU1满负荷运转执行 func110秒钟,而CPU2半负荷运转执行 func25秒钟,剩下5s是idle。
算法1:
:实际上 func1和 func2一起是占用了15s的CPU时间。根据计算, func占用的时间占总时间的 15s/(10s*32)=4.69%。
算法2:
如果按照上面第三节所描述的方法绘制火焰图,采样结果应该是 func1有大约990个样本, func2有大约 990/2/2=248个样本,绘制出来的火焰图 func占比为 (990+248)/31680=3.9%
两者不相等!笔者认为,原因在于二者算法所获结果的含义不同。算法1计算出来的是在这种运行情形下实际 func的执行时间占比。而算法2计算出来(或者说绘制出来)的是在CPU满负荷运转下func的CPU时间占比。从现实来看,不同背景负载,不同情形下同一个workload的运行时间可能不同。当系统负载加重时,Linux会自动控制CPUfreq将CPU频率增加。单单查看在某一个情形下workload的CPU执行时间意义有限。但是,对于一个workload而言,他所需要占用的计算资源量往往是相同的。因此,从程序优化角度而言,采用第三节所描述的方法计算CPU满负载下应用程序的时间占比对于我们优化代码更具有指导性意义。
(END)
linux终端火焰,火焰图系列之使用火焰图隐藏功能提高绘制精度相关推荐
- 火焰图系列之使用火焰图隐藏功能提高绘制精度
作者简介 武汉光电国家研究中心DSAL实验室在读博士生.主要研究方向: Linux memory and storage system, Concurrency optimization. https ...
- linux中打开gif图片命令,在Linux终端中安装使用Gifski创建GIF动图
Gifski 是一款跨平台的高质量 GIF 编码器,在 Linux 终端中可以安装及使用 Gifski 来创建高质量的 GIF 动图及使用 Gifski 从视频创建 GIF 动图. Gifski 简介 ...
- cad查看_CAD看图软件电脑版4种隐藏功能!
我打赌,你肯定没有仔细看过浩辰CAD看图王电脑版的使用说明,不然你就不会不知道,浩辰CAD看图王电脑版有4种"隐藏"功能! 快往下看看,你发现了几个? 隐藏功能:隐身模式 不想暴 ...
- 【文生图系列】文生图大模型合集与效果对比
文章目录 DELL · E DELL · E 1 DELL · E 2 ERNIE-ViLG ERNIE-ViLG 1 ERNIE-ViLG 2 Paddlehub Imagen Midjourney ...
- UML图系列——用例图
UML图系列文章目录 UML图系列--UML概要 UML图系列--建模和面向对象 UML图系列--UML模型图的构成 经过前面几篇文章的概念介绍后,今天来介绍UML 13种 图中的第一种用例图 用例图 ...
- 思维导图系列——计算机网络
思维导图系列--操作系统 思维导图为博主期末复习亲自整理而成的,知识点覆盖全,可直接看思维导图复习,包含注解,图示等,觉得对你有帮助,不妨一键三连哦!.[链接见文末!!!] 参考书目: 计算机网络(第 ...
- linux 终端打印图片,Linux终端打印命令使用介绍
常用linux打印命令 日常使用中或shell脚本中linux终端打印命令有echo和printf. echo命令 功能说明:显示文字. 语 法:echo [-ne][字符串]或 echo [--he ...
- 安卓可以用计算机隐藏照片吗,用美图看看安卓版随心隐藏私人图片!
手机本来就是一件很私人的物品,所以,如果存在手里的图片随便都可以让人翻阅的话,那私密性就没有任何保障了.如何不让其他人轻松就能看到.但自己可以随意调出手机里的私人图片呢?答案就是用美图看看安卓版的图片 ...
- 怎么在手机上不用root运行Linux,【termux系列】安卓手机不需要root运行Linux终端,并开启图形化远程...
前言 众所周知,安卓是基于Linux二次开发的手机系统,也是支持Linux指令的,使用一些软件就可以完美运行Linux指令,Linux终端是分的有root版与非root版的,本次就使用非root的终端 ...
最新文章
- ubuntu搭建jdk1.8运行环境(下载jdk方式)
- 分享一个牛逼的阿里天猫面经,已经拿到 Offer ,来自朋友的朋友
- [转载] 启用和禁用 Reporting Services 的客户端打印和导出文件格式
- 使用Filter实现用户自动登录
- Spark UI无法查看到slave节点
- Redis2-简单动态字符串
- 读嵌入式linux驱动程序设计从入门到精通 3
- Hi3519V101芯片介绍
- 2010年中国互联网十大事件
- Unity渲染(四):Shader着色器基础入门之获取当前屏幕贴图
- 基于B_spline 的非刚性形变
- iOS开发中关于微信朋友圈停留在上次浏览位置的实现思路
- 为什么大数据使用相关关系而不是因果分析?
- 开启xmp1还是2_英雄联盟手游高帧率模式怎么开启-高帧率模式开启方法
- android相框_如何将旧的Android平板电脑变成自动更新的数码相框
- 基于Node.js + jade + Mongoose 模仿gokk.tv
- 知乎 | 博士毕业,选择进高校还是30万年薪私企?
- 垃圾邮件检测_如何在您的电子邮件中检测垃圾邮件
- matlab 在半对数坐标系下绘图
- 电脑提速方法:虚拟内存使用固态硬盘