0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Linux阅码场 来源:Linuxer 2020-06-23 10:15 次阅读

由于CPU能耗优化的原因,火焰图有时并不准确。为此,我们来做一个小实验。

(还不熟悉什么是火焰图的可以看看文章末尾火焰图系列文章汇总)

1.小实验

这是一个简单C程序,其实就是一个死循环,如下:

#includeint globalv;void dosth(){ globalv++;}int main(){ globalv = 0; for(;;) dosth(); return 0;}

编译后可执行程序名为 func。接下来我开了两个终端,分别使用 taskset将 func运行在CPU0和CPU1上:

taskset 0x1 ./functaskset 0x2 ./func

然后使用bcc+flamegraph绘制火焰图:

/bcc/profile -I -F 99 -daf 10 > out.profile/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个样本/(min*CPU)。运行了10s,那么总的样本数应该大约为 99*10*32=31680。而实际的总采样数只有8197。分母小了,自然 func占用的CPU时间比例增加了。

3.解决办法

当然,我们可以修改CPUfreq强制让所有满负荷工作。但是这样一来麻烦,二来我的测试环境是虚拟机,修改起来更加麻烦。我们希望用一个简单的方法解决。

这就要提到flamegraph的隐藏功能了。为什么叫隐藏功能?因为如果你简单地 ./flamegraph.pl--help他不会告诉你这个用法。但是实际上他已经实现了这个功能,语法是:

./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满负载下应用程序的时间占比对于我们优化代码更具有指导性意义。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211133
  • 程序
    +关注

    关注

    116

    文章

    3775

    浏览量

    80843

原文标题:火焰图系列之使用火焰图隐藏功能提高绘制精度

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    火焰传感器的特征及应用

    火焰被发出的弱紫外线,可实现点火、熄火报警连锁等自动控制功能火焰传感器可以用来探测火源或其它一些波长在700纳米~1000纳米范围内的热源。火焰传感器的
    发表于 04-18 14:55

    急求一个火焰传感器模块的原理

    想做一个灭火机器人,急求一个火焰传感器模块的原理{:4_97:}求大神帮帮
    发表于 08-20 16:25

    火焰探测电路

    想要做一个灭火装置,老师要我先找一个火焰探测器的电路,然后做PCB板子,有没有探测火焰的电路
    发表于 11-04 20:20

    honeywell火焰探测器

    检测到。只要有稳定的辐射发光就可以被探测到。例如,炉膛内炽热的表面,对探测器没有影响。C70XX 系列紫外光火焰探测器C70XX系列紫外光火焰探测器适用于气体、液体(油)燃料、非连续燃
    发表于 04-27 12:28

    火焰探测器参考方案

    和室外。而随着技术的进步,这样的分界也逐渐模糊起来,比如今天我们拆解的这款由世健国际贸易(上海)有限公司设计的红外火焰探测参考方案,就集快速、长距、高灵敏度等性能于一身,让人刮目相看。1:世健红外火焰
    发表于 06-21 05:00

    基于单片机的防火报警系统_DS18B20测温+火焰传感器 相关资料下载

    摘要随着现代家庭用火、用电量的增加,家庭火灾发生的频率越来越高。防火报警器也随之被广泛应用于各种场合。本文章所研究的无线多功能防火报警系统采用STC12C5A60S2为核心控制器,利用火焰传感器
    发表于 07-01 08:23

    为巡线小车添加火焰检测功能

    当小车可以自行完成巡线功能后,在有剩余空闲I/O口的情况下,还可以为巡线小车添加火焰检测功能,让它成为名副其实的 “巡防小车” !添加火焰检测功能
    发表于 09-08 06:34

    火焰传感器的工作原理是什么

    火焰传感器的工作原理是什么?使用火焰传感器有哪些注意事项?
    发表于 10-15 06:55

    Arduion UNO&amp;Nano;火焰传感器模块

    说明:火焰传感器(即红外接收三极管)是一种对火焰特别敏感的传感器。其利用红外线对火焰的敏感特性,用特制的红外线接收管来检测火焰,然后将火焰
    发表于 04-25 16:38

    UV紫外线火焰传感器及其典型电路

    UV紫外线火焰传感器及其典型电路
    发表于 06-08 16:03 5894次阅读
    UV紫外线<b class='flag-5'>火焰</b>传感器及其典型电路<b class='flag-5'>图</b>

    火焰传感器电路

    火焰传感器电路,用于探测火源的具体位置在哪里。
    发表于 05-20 11:47 44次下载

    火焰

    LED火焰
    发表于 02-27 16:28 20次下载

    隧道专用火焰探测器的技术参数

    火焰探测器广泛应用于燃气,隧道,化工,冶金,制药等行业,探测器适用于汽油、煤油、柴油、航空汽油、液压油、碳氢化合物:乙烯、聚乙烯、天 然气、民用燃气、液化石油气、甲烷、乙烷、丙烷、氢气、酒精、隧道等产生爆燃场所的火焰检测。
    发表于 03-14 15:33 1926次阅读

    火焰:全局视野的Linux性能剖析

    CPU火焰图中的每一个方框是一个函数,方框的长度,代表了它的执行时间,所以越宽的函数,执行越久。火焰的楼层每高一层,就是更深一级的函数被调用,最顶层的函数,是叶子函数。
    的头像 发表于 06-28 09:44 2025次阅读

    使用Arthas火焰工具的Java应用性能分析和优化经验

    分享作者在使用Arthas火焰工具进行Java应用性能分析和优化的经验。
    的头像 发表于 10-28 09:27 151次阅读
    使用Arthas<b class='flag-5'>火焰</b><b class='flag-5'>图</b>工具的Java应用性能分析和优化经验