0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

火焰圖系列之使用火焰圖隱藏功能提高繪制精度

Linux閱碼場 ? 來源:Linuxer ? 2020-06-23 10:15 ? 次閱讀

由于CPU能耗優(yōu)化的原因,火焰圖有時并不準(zhǔn)確。為此,我們來做一個小實驗。

(還不熟悉什么是火焰圖的可以看看文章末尾火焰圖系列文章匯總)

1.小實驗

這是一個簡單C程序,其實就是一個死循環(huán),如下:

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

編譯后可執(zhí)行程序名為 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.plout.svg

得到的火焰圖:

我的測試環(huán)境是Qemu/KVM, 32核。

我們可以看到,火焰圖顯示, func程序占用了近四分之一的CPU時間。但是由于我們把 func綁定在CPU0和1上執(zhí)行,根據(jù)小學(xué)數(shù)學(xué)我們應(yīng)該可以計算出來 func最多占用 2/32=6.25%的時間。

是不是有點不對?

2.原因

由于Linux會對CPU進行能耗優(yōu)化,在低負載的時候,CPU并不是滿負荷工作(降頻),因此對于Idle的CPU,bcc的采樣數(shù)會減少,從而導(dǎo)致總采樣數(shù)減少。我們可以看到,我們的采樣頻率是99個樣本/(min*CPU)。運行了10s,那么總的樣本數(shù)應(yīng)該大約為 99*10*32=31680。而實際的總采樣數(shù)只有8197。分母小了,自然 func占用的CPU時間比例增加了。

3.解決辦法

當(dāng)然,我們可以修改CPUfreq強制讓所有滿負荷工作。但是這樣一來麻煩,二來我的測試環(huán)境是虛擬機,修改起來更加麻煩。我們希望用一個簡單的方法解決。

這就要提到flamegraph的隱藏功能了。為什么叫隱藏功能?因為如果你簡單地 ./flamegraph.pl--help他不會告訴你這個用法。但是實際上他已經(jīng)實現(xiàn)了這個功能,語法是:

./flamegraph.pl --total=N < out.profile > out2.svg

其中N為用戶規(guī)定的總采樣數(shù)。在我們的示例中,應(yīng)該是31680。這樣,我們繪制出來的火焰圖是這個樣子的:

嗯,的確有點丑,但是6.26%才是 func真正消耗了的CPU時間比例。

4.關(guān)于CPU時間準(zhǔn)確性的討論

怎樣才算是繪制了準(zhǔn)確的火焰圖呢?

考慮如下情形,如果CPU1滿負荷運轉(zhuǎn)執(zhí)行 func110秒鐘,而CPU2半負荷運轉(zhuǎn)執(zhí)行 func25秒鐘,剩下5s是idle。

算法1::實際上 func1和 func2一起是占用了15s的CPU時間。根據(jù)計算, func占用的時間占總時間的 15s/(10s*32)=4.69%。

算法2:如果按照上面第三節(jié)所描述的方法繪制火焰圖,采樣結(jié)果應(yīng)該是 func1有大約990個樣本, func2有大約 990/2/2=248個樣本,繪制出來的火焰圖 func占比為 (990+248)/31680=3.9%

兩者不相等!筆者認為,原因在于二者算法所獲結(jié)果的含義不同。算法1計算出來的是在這種運行情形下實際 func的執(zhí)行時間占比。而算法2計算出來(或者說繪制出來)的是在CPU滿負荷運轉(zhuǎn)下func的CPU時間占比。從現(xiàn)實來看,不同背景負載,不同情形下同一個workload的運行時間可能不同。當(dāng)系統(tǒng)負載加重時,Linux會自動控制CPUfreq將CPU頻率增加。單單查看在某一個情形下workload的CPU執(zhí)行時間意義有限。但是,對于一個workload而言,他所需要占用的計算資源量往往是相同的。因此,從程序優(yōu)化角度而言,采用第三節(jié)所描述的方法計算CPU滿負載下應(yīng)用程序的時間占比對于我們優(yōu)化代碼更具有指導(dǎo)性意義。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10776

    瀏覽量

    210464
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3749

    瀏覽量

    80670

原文標(biāo)題:火焰圖系列之使用火焰圖隱藏功能提高繪制精度

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    火焰傳感器的特征及應(yīng)用

    火焰被發(fā)出的弱紫外線,可實現(xiàn)點火、熄火報警連鎖等自動控制功能。 火焰傳感器可以用來探測火源或其它一些波長在700納米~1000納米范圍內(nèi)的熱源。火焰傳感器的
    發(fā)表于 04-18 14:55

    急求一個火焰傳感器模塊的原理

    想做一個滅火機器人,急求一個火焰傳感器模塊的原理{:4_97:}求大神幫幫
    發(fā)表于 08-20 16:25

    火焰探測電路

    想要做一個滅火裝置,老師要我先找一個火焰探測器的電路,然后做PCB板子,有沒有探測火焰的電路
    發(fā)表于 11-04 20:20

    honeywell火焰探測器

    檢測到。只要有穩(wěn)定的輻射發(fā)光就可以被探測到。例如,爐膛內(nèi)熾熱的表面,對探測器沒有影響。C70XX 系列紫外光火焰探測器C70XX系列紫外光火焰探測器適用于氣體、液體(油)燃料、非連續(xù)燃
    發(fā)表于 04-27 12:28

    火焰探測器參考方案

    和室外。而隨著技術(shù)的進步,這樣的分界也逐漸模糊起來,比如今天我們拆解的這款由世健國際貿(mào)易(上海)有限公司設(shè)計的紅外火焰探測參考方案,就集快速、長距、高靈敏度等性能于一身,讓人刮目相看。1:世健紅外火焰
    發(fā)表于 06-21 05:00

    基于單片機的防火報警系統(tǒng)_DS18B20測溫+火焰傳感器 相關(guān)資料下載

    摘要隨著現(xiàn)代家庭用火、用電量的增加,家庭火災(zāi)發(fā)生的頻率越來越高。防火報警器也隨之被廣泛應(yīng)用于各種場合。本文章所研究的無線多功能防火報警系統(tǒng)采用STC12C5A60S2為核心控制器,利用火焰傳感器
    發(fā)表于 07-01 08:23

    為巡線小車添加火焰檢測功能

    當(dāng)小車可以自行完成巡線功能后,在有剩余空閑I/O口的情況下,還可以為巡線小車添加火焰檢測功能,讓它成為名副其實的 “巡防小車” !添加火焰檢測功能
    發(fā)表于 09-08 06:34

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

    火焰傳感器的工作原理是什么?使用火焰傳感器有哪些注意事項?
    發(fā)表于 10-15 06:55

    Arduion UNO&amp;Nano;火焰傳感器模塊

    說明:火焰傳感器(即紅外接收三極管)是一種對火焰特別敏感的傳感器。其利用紅外線對火焰的敏感特性,用特制的紅外線接收管來檢測火焰,然后將火焰
    發(fā)表于 04-25 16:38

    火焰牌燃氣灶電子點火器電路

    火焰牌燃氣灶電子點火器電路
    發(fā)表于 02-15 13:10 ?5259次閱讀
    <b class='flag-5'>火焰</b>牌燃氣灶電子點火器電路<b class='flag-5'>圖</b>

    UV紫外線火焰傳感器及其典型電路

    UV紫外線火焰傳感器及其典型電路
    發(fā)表于 06-08 16:03 ?5849次閱讀
    UV紫外線<b class='flag-5'>火焰</b>傳感器及其典型電路<b class='flag-5'>圖</b>

    火焰傳感器電路

    火焰傳感器電路,用于探測火源的具體位置在哪里。
    發(fā)表于 05-20 11:47 ?44次下載

    火焰

    LED火焰
    發(fā)表于 02-27 16:28 ?20次下載

    隧道專用火焰探測器的技術(shù)參數(shù)

    火焰探測器廣泛應(yīng)用于燃氣,隧道,化工,冶金,制藥等行業(yè),探測器適用于汽油、煤油、柴油、航空汽油、液壓油、碳氫化合物:乙烯、聚乙烯、天 然氣、民用燃氣、液化石油氣、甲烷、乙烷、丙烷、氫氣、酒精、隧道等產(chǎn)生爆燃場所的火焰檢測。
    發(fā)表于 03-14 15:33 ?1885次閱讀

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

    CPU火焰圖中的每一個方框是一個函數(shù),方框的長度,代表了它的執(zhí)行時間,所以越寬的函數(shù),執(zhí)行越久。火焰的樓層每高一層,就是更深一級的函數(shù)被調(diào)用,最頂層的函數(shù),是葉子函數(shù)。
    的頭像 發(fā)表于 06-28 09:44 ?1998次閱讀