最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux下性能分析工具Perf安裝與用法

 更新時(shí)間:2024年05月17日 11:11:56   作者:夜雨聽(tīng)蕭瑟  
perf是Linux下的一款性能分析工具,能夠進(jìn)行函數(shù)級(jí)與指令級(jí)的熱點(diǎn)查找,它由一個(gè)叫“Performance?counters“的內(nèi)核子系統(tǒng)實(shí)現(xiàn),可用于性能瓶頸的查找與熱點(diǎn)代碼的定位,本文給大家介紹了Linux?Perf安裝與使用,需要的朋友可以參考下

1、Perf介紹

perf是Linux下的一款性能分析工具,能夠進(jìn)行函數(shù)級(jí)與指令級(jí)的熱點(diǎn)查找。它由一個(gè)叫“Performance counters“的內(nèi)核子系統(tǒng)實(shí)現(xiàn),基于事件采樣原理,以性能事件為基礎(chǔ),支持針對(duì)處理器相關(guān)性能指標(biāo)與操作系統(tǒng)相關(guān)性能指標(biāo)的性能剖析,可用于性能瓶頸的查找與熱點(diǎn)代碼的定位。

Perf的主要功能和用途如下:

事件采樣:Perf使用硬件性能計(jì)數(shù)器來(lái)采樣事件,如CPU指令、緩存命中、緩存失效等,從而獲取系統(tǒng)在運(yùn)行時(shí)的性能數(shù)據(jù)。

調(diào)用圖:Perf可以生成函數(shù)調(diào)用圖,顯示函數(shù)之間的調(diào)用關(guān)系和耗時(shí),幫助識(shí)別程序的熱點(diǎn)和性能瓶頸。

火焰圖:火焰圖是Perf輸出的一種可視化圖表,它可以直觀地展示函數(shù)調(diào)用的耗時(shí)情況和函數(shù)的調(diào)用關(guān)系,以便快速準(zhǔn)確地識(shí)別最頻繁的代碼路徑,幫助快速定位性能瓶頸。

內(nèi)存分析:Perf可以收集內(nèi)存事件,如內(nèi)存訪問(wèn)、缺頁(yè)異常等,幫助識(shí)別內(nèi)存性能問(wèn)題。

鎖分析:Perf可以監(jiān)測(cè)鎖的使用情況,幫助發(fā)現(xiàn)多線程程序中的競(jìng)爭(zhēng)問(wèn)題。

Tracing支持:Perf支持Linux Trace Toolkit Next Generation (LTTng)和eBPF等跟蹤工具,用于深入分析系統(tǒng)的行為。

報(bào)告生成:Perf能夠生成詳細(xì)的報(bào)告和統(tǒng)計(jì)信息,方便用戶理解和分析性能數(shù)據(jù)。

2、火焰圖分類

(1)CPU

用途:檢測(cè)導(dǎo)致CPU運(yùn)行繁忙的原因。

(2)Memory Flame Graphs

用途:檢測(cè)應(yīng)用程序內(nèi)存使用量增加的原因。

(3)Off-CPU Flame Graphs

用途:有些性能問(wèn)題不是CPU的性能問(wèn)題,即進(jìn)程和線程不在CPU上運(yùn)行時(shí)花費(fèi)角度的時(shí)間,而是在程序請(qǐng)求期間花費(fèi)了不少時(shí)間,這種情況也會(huì)成比例的影響性能。

(4)Hot/Cold Flame Graphs

用途:將CPU和非CPU火焰圖結(jié)合在一起。它在一個(gè)圖表中顯示了所有線程的運(yùn)行時(shí)間,并允許直接比較在CPU和非CPU上的代碼路徑持續(xù)時(shí)間。

(5)Differential

用途:紅藍(lán)差異火焰圖,分析不同時(shí)刻CPU性能變化的原因。

 3、火焰圖安裝命令

(1)安裝Perf工具

$ sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y    //下載Perf
$ perf -v    //查看安裝Perf的版本

(2)下載可視化工具FlameGraph

下載地址:GitHub - brendangregg/FlameGraph: Stack trace visualizer

 4、火焰圖demo測(cè)試

測(cè)試程序如下:

#include <stdio.h>
#define DEF_PRINT    
 
 
void funcA()
{
    for(int i=0; i < 10*10000;i++)
    {
#ifdef DEF_PRINT
       printf("funcA\n");
#endif
    }
}
 
void funcB()
{
    for(int i=0; i < 20*10000;i++)
    {
#ifdef DEF_PRINT
         printf("funcB\n");
#endif
    }
}
 
void funcC()
{
    for(int i=0; i < 30*10000;i++)
    {
#ifdef DEF_PRINT
         printf("funcC\n");
#endif
    }
}
 
void printf1();
void printf2();
void funcD()
{
    for(int i=0; i < 20*10000;i++)
    {
#ifdef DEF_PRINT
         printf("funcD\n");
#endif
    }
    printf1();
}
 
void printf1()
{
    for(int i=0; i < 10*10000;i++)
    {
#ifdef DEF_PRINT
         printf("printf1\n");
#endif
    }
    printf2();
}
 
void printf2()
{
    for(int i=0; i < 10*10000;i++)
    {
#ifdef DEF_PRINT
        printf("printf2\n");
#endif
    }
}
 
int main()
{
    while (true) {
        funcA();
        funcB();
        funcC();
        funcD();
    }
    return 0;
}

程序編譯命令:

g++ -g -O0 main.cpp -o main //-g帶調(diào)試信息編譯,禁止優(yōu)化O0,

(1)生成CPU火焰圖1

生成火焰圖步驟如下:

程序運(yùn)行結(jié)果如下:

//上面main程序運(yùn)行時(shí),使用top查看,進(jìn)程PID為5606,CPU為86.3%左右。
 
$ sudo perf record -F 99 -p 5606 -g -- sleep 30
//-F 99 表示每秒99次采樣, -p 5606 是進(jìn)程號(hào), 即對(duì)哪個(gè)進(jìn)程進(jìn)行分析, -g 表示記錄調(diào)用棧, sleep 30 則是持續(xù)30秒。
 
$ sudo perf script -i perf.data &>perf.unfold
//perf script 工具對(duì) perf.data 進(jìn)行解析,生成折疊后的調(diào)用棧。
 
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded
//下載的可視化工具FlameGraph在當(dāng)前文件上一層,用 stackcollapse-perf.pl 將 perf 解析出的內(nèi)容 perf.unfold 中的符號(hào)進(jìn)行折疊。
 
$ ../FlameGraph/flamegraph.pl perf.folded >perf1.svg
//生成svg圖

使用瀏覽器打開(kāi)perf.svg圖,效果如下:

(2)火焰圖表解析

上圖中每個(gè)方塊代表堆棧中的一個(gè)函數(shù),也叫堆棧幀。

y軸:表示堆棧深度,火焰越高,表示函數(shù)調(diào)用層級(jí)越深,最頂部的方塊表示當(dāng)前CPU上運(yùn)行的函數(shù),每一塊的函數(shù)下方都是當(dāng)前函數(shù)的調(diào)用方。

x軸:表示當(dāng)前函數(shù)的采樣數(shù),與大多數(shù)圖表不同,它不顯示從左到右的時(shí)間流逝。左到右的排序沒(méi)有意義(它按字母順序排序以最大程度地合并幀),方框的寬度顯示了它在CPU上運(yùn)行的總時(shí)間(基于采樣計(jì)數(shù))。哪個(gè)方塊的寬度比較大,就表示該函數(shù)可能存在性能問(wèn)題。

注意:圖標(biāo)中顏色不具有顯著意義,通常是隨機(jī)選擇的暖色調(diào)。這種可視化稱為"火焰圖",因?yàn)樗畛跤糜陲@示CPU上的熱點(diǎn),而且看起來(lái)像火焰。

它也是交互式的:將鼠標(biāo)懸停在SVG上以顯示詳細(xì)信息,并單擊進(jìn)行縮放。

(3)當(dāng)前程序圖標(biāo)分析

從(1)中火焰圖中看出,沒(méi)有demo中定義的函數(shù),這是因?yàn)閜rintf函數(shù)占用改進(jìn)程的CPU性能較高,而for循環(huán)邏輯占用性能較低,可以點(diǎn)擊火焰圖上的搜索按鍵Search進(jìn)行搜索,本文搜索程序入口函數(shù)。

確定入口函數(shù)的步驟如下:

a> 入口函數(shù)地址確定

輸入下面命令

$ readelf -h main

可執(zhí)行文件信息如下: 

b> 獲取對(duì)應(yīng)地址入口函數(shù)

輸入下面命令:

$ readelf -s main

由上圖可知入口函數(shù)為_(kāi)start,所以搜索_start函數(shù)。

_start搜索結(jié)果如下:

點(diǎn)擊__libc_start_main函數(shù),進(jìn)入對(duì)于函數(shù)調(diào)用過(guò)程,如下:

(4)生成火焰圖2

將上面的代碼中的#define DEF_PRINT  行進(jìn)行屏蔽,這樣函數(shù)就不會(huì)打印輸出到屏幕上。重新編譯代碼,運(yùn)行。

生成火焰圖步驟跟上面(1)中一樣,只是-p參數(shù)的進(jìn)程ID號(hào)不同,生成的svg圖片如下:

由svg圖表可知,funcA在mainNoPrint進(jìn)程中,占用該進(jìn)程CPU 10%,funcB占用該進(jìn)程CPU 20%,funcC占用該進(jìn)程CPU 30%,funcD占用該進(jìn)程CPU 40%。 

(5)生成差分火焰圖

運(yùn)行mainNoPrint函數(shù),抓取系統(tǒng)所有進(jìn)程的CPU,命令如下:

$ sudo perf record -F 99 -a -g -- sleep 30     //a表示對(duì)所有進(jìn)程堆棧數(shù)據(jù)進(jìn)行抓取
$ sudo perf script -i perf.data &>perf.unfold
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded1
$ ../FlameGraph/flamegraph.pl perf.folded1 >perf1.svg

生成的火焰圖如下:

停止mainNoPrint程序,抓取系統(tǒng)所有進(jìn)程的CPU,命令如下:

$ sudo perf record -F 99 -a -g -- sleep 30
$ sudo perf script -i perf.data &>perf.unfold
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded2
$ ../FlameGraph/flamegraph.pl perf.folded2 >perf2.svg

生成的火焰圖如下:

以perf.folded2的為基準(zhǔn),生成差分火焰圖,命令如下:

$./FlameGraph/difffolded.pl perf.folded2 perf.folded1|../FlameGraph/flamegraph.pl >diff1.svg

生成的差分火焰圖如下:

由紅色部分圖可知,CPU中funcD等函數(shù)占用的CPU增加了,藍(lán)色部分相對(duì)于上次CPU減少了。

以上就是Linux下性能分析工具Perf安裝與用法的詳細(xì)內(nèi)容,更多關(guān)于Linux Perf安裝與使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • CentOS 6.8 NFS 文件共享設(shè)置的方法

    CentOS 6.8 NFS 文件共享設(shè)置的方法

    這篇文章主要介紹了CentOS 6.8 NFS 文件共享設(shè)置的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Linux安裝redis后沒(méi)有redis-server的問(wèn)題

    Linux安裝redis后沒(méi)有redis-server的問(wèn)題

    這篇文章主要介紹了Linux安裝redis后沒(méi)有redis-server的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • CentOS 6.5配置本地Yum源教程

    CentOS 6.5配置本地Yum源教程

    這篇文章主要為大家詳細(xì)介紹了CentOS 6.5配置本地Yum源教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • linux下搭建go環(huán)境的安裝配置講解

    linux下搭建go環(huán)境的安裝配置講解

    今天小編就為大家分享一篇關(guān)于linux下搭建go環(huán)境的安裝配置講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • 深入解析Apache Ignite 的監(jiān)控與指標(biāo)(Monitoring and Metrics)

    深入解析Apache Ignite 的監(jiān)控與指標(biāo)(Monitoring and 

    Apache Ignite監(jiān)控涵蓋全棧視角,通過(guò)JMX、編程及系統(tǒng)視圖獲取指標(biāo),區(qū)分全局與節(jié)點(diǎn)級(jí)數(shù)據(jù),實(shí)現(xiàn)集群和單節(jié)點(diǎn)的可觀測(cè)性,保障生產(chǎn)環(huán)境穩(wěn)定性與性能,下面通過(guò)本文詳細(xì)介紹Apache Ignite 的監(jiān)控與指標(biāo)(Monitoring and Metrics),感興趣的朋友一起看看吧
    2025-07-07
  • Linux如何實(shí)現(xiàn)批量注釋

    Linux如何實(shí)現(xiàn)批量注釋

    文章介紹了在Linux中批量注釋和取消注釋代碼行的快捷方法,具體步驟包括使用Ctrl+V進(jìn)入塊選擇模式,上下鍵選擇需要操作的行,然后按Shift+I輸入注釋符號(hào)(//或#),按ESC鍵保存
    2025-03-03
  • Ubuntu交換區(qū)(Swap)擴(kuò)容實(shí)現(xiàn)方式

    Ubuntu交換區(qū)(Swap)擴(kuò)容實(shí)現(xiàn)方式

    本文介紹了如何在Linux系統(tǒng)中調(diào)整Swap分區(qū)和Swap文件的大小,包括關(guān)閉當(dāng)前Swap、刪除舊的Swap、創(chuàng)建新的Swap(文件或分區(qū))、格式化新Swap、啟用新Swap、驗(yàn)證新Swap狀態(tài)以及編輯fstab文件以確保新Swap在開(kāi)機(jī)時(shí)自動(dòng)掛載
    2026-02-02
  • Linux下一鍵啟停Python服務(wù)腳本的超實(shí)用方法

    Linux下一鍵啟停Python服務(wù)腳本的超實(shí)用方法

    這篇文章主要為大家詳細(xì)介紹了Linux下一鍵啟停Python服務(wù)腳本的超實(shí)用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • 淺析Linux中crontab任務(wù)調(diào)度

    淺析Linux中crontab任務(wù)調(diào)度

    這篇文章主要介紹了Linux中crontab任務(wù)調(diào)度的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • linux下的dhcp服務(wù)的完全配置(圖文詳解)

    linux下的dhcp服務(wù)的完全配置(圖文詳解)

    linux下的dhcp服務(wù)的完全配置詳解,需要的朋友可以參考下
    2012-10-10

最新評(píng)論

文安县| 东山县| 祁阳县| 西藏| 含山县| 北海市| 休宁县| 津市市| 体育| 富源县| 来宾市| 苏尼特右旗| 鸡西市| 荆州市| 轮台县| 绍兴县| 肥东县| 彰武县| 亳州市| 综艺| 金塔县| 客服| 赤峰市| 姚安县| 西峡县| 永修县| 阿克苏市| 邢台县| 晴隆县| 卓资县| 楚雄市| 苍山县| 平顶山市| 克什克腾旗| 聂荣县| 绥中县| 炎陵县| 波密县| 房产| 安泽县| 泰顺县|