原创 红烧的威化饼 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终端火焰,火焰图系列之使用火焰图隐藏功能提高绘制精度相关推荐

  1. 火焰图系列之使用火焰图隐藏功能提高绘制精度

    作者简介 武汉光电国家研究中心DSAL实验室在读博士生.主要研究方向: Linux memory and storage system, Concurrency optimization. https ...

  2. linux中打开gif图片命令,在Linux终端中安装使用Gifski创建GIF动图

    Gifski 是一款跨平台的高质量 GIF 编码器,在 Linux 终端中可以安装及使用 Gifski 来创建高质量的 GIF 动图及使用 Gifski 从视频创建 GIF 动图. Gifski 简介 ...

  3. cad查看_CAD看图软件电脑版4种隐藏功能!

    我打赌,你肯定没有仔细看过浩辰CAD看图王电脑版的使用说明,不然你就不会不知道,浩辰CAD看图王电脑版有4种"隐藏"功能! ​快往下看看,你发现了几个? 隐藏功能:隐身模式 不想暴 ...

  4. 【文生图系列】文生图大模型合集与效果对比

    文章目录 DELL · E DELL · E 1 DELL · E 2 ERNIE-ViLG ERNIE-ViLG 1 ERNIE-ViLG 2 Paddlehub Imagen Midjourney ...

  5. UML图系列——用例图

    UML图系列文章目录 UML图系列--UML概要 UML图系列--建模和面向对象 UML图系列--UML模型图的构成 经过前面几篇文章的概念介绍后,今天来介绍UML 13种 图中的第一种用例图 用例图 ...

  6. 思维导图系列——计算机网络

    思维导图系列--操作系统 思维导图为博主期末复习亲自整理而成的,知识点覆盖全,可直接看思维导图复习,包含注解,图示等,觉得对你有帮助,不妨一键三连哦!.[链接见文末!!!] 参考书目: 计算机网络(第 ...

  7. linux 终端打印图片,Linux终端打印命令使用介绍

    常用linux打印命令 日常使用中或shell脚本中linux终端打印命令有echo和printf. echo命令 功能说明:显示文字. 语 法:echo [-ne][字符串]或 echo [--he ...

  8. 安卓可以用计算机隐藏照片吗,用美图看看安卓版随心隐藏私人图片!

    手机本来就是一件很私人的物品,所以,如果存在手里的图片随便都可以让人翻阅的话,那私密性就没有任何保障了.如何不让其他人轻松就能看到.但自己可以随意调出手机里的私人图片呢?答案就是用美图看看安卓版的图片 ...

  9. 怎么在手机上不用root运行Linux,【termux系列】安卓手机不需要root运行Linux终端,并开启图形化远程...

    前言 众所周知,安卓是基于Linux二次开发的手机系统,也是支持Linux指令的,使用一些软件就可以完美运行Linux指令,Linux终端是分的有root版与非root版的,本次就使用非root的终端 ...

最新文章

  1. ubuntu搭建jdk1.8运行环境(下载jdk方式)
  2. 分享一个牛逼的阿里天猫面经,已经拿到 Offer ,来自朋友的朋友
  3. [转载] 启用和禁用 Reporting Services 的客户端打印和导出文件格式
  4. 使用Filter实现用户自动登录
  5. Spark UI无法查看到slave节点
  6. Redis2-简单动态字符串
  7. 读嵌入式linux驱动程序设计从入门到精通 3
  8. Hi3519V101芯片介绍
  9. 2010年中国互联网十大事件
  10. Unity渲染(四):Shader着色器基础入门之获取当前屏幕贴图
  11. 基于B_spline 的非刚性形变
  12. iOS开发中关于微信朋友圈停留在上次浏览位置的实现思路
  13. 为什么大数据使用相关关系而不是因果分析?
  14. 开启xmp1还是2_英雄联盟手游高帧率模式怎么开启-高帧率模式开启方法
  15. android相框_如何将旧的Android平板电脑变成自动更新的数码相框
  16. 基于Node.js + jade + Mongoose 模仿gokk.tv
  17. 知乎 | 博士毕业,选择进高校还是30万年薪私企?
  18. 垃圾邮件检测_如何在您的电子邮件中检测垃圾邮件
  19. matlab 在半对数坐标系下绘图
  20. 电脑提速方法:虚拟内存使用固态硬盘

热门文章

  1. 爱因斯坦送给子孙后代的话
  2. 自动化找计算机工作吗,自动化专业好找工作吗?就业方向都有哪些?
  3. 学生手册成绩分析-以学院为单位进行划分
  4. 爱普生Epson Stylus Photo 700 打印机驱动
  5. AndroidStuido连接不上手机的解决方法 !
  6. weblogic12.2.1.3补丁升级步骤
  7. 编写第一个flutter的安卓app
  8. flink sql去重
  9. Python进行数组的排序、倒序、截取
  10. html table 如何导出为excel表格案例分享