日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux性能分析工具与图形化方法

發(fā)布時(shí)間:2023/12/20 linux 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux性能分析工具与图形化方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實(shí)踐干貨哦~。

作者:趙坤|騰訊魔王工作室后臺(tái)開發(fā)工程師

在項(xiàng)目開發(fā)中,經(jīng)常會(huì)遇到程序啟動(dòng)時(shí)間過長(zhǎng)、CPU使用率過高等問題,這個(gè)時(shí)候需要依靠性能分析工具來定位性能的消耗點(diǎn)。本文介紹三個(gè)常用的工具的入門級(jí)使用及圖形化方法,供大家參考。

本文介紹Perf、gprof和Valgrind三個(gè)性能分析工具,及其分析結(jié)果圖形化的方法,旨在讓大家更快的上手使用工具。出于篇幅的限制,本文不會(huì)對(duì)每種工具的使用參數(shù)及結(jié)果分析做詳細(xì)的介紹,只做入門級(jí)的使用說明,更多詳細(xì)的說明大家請(qǐng)Google一下。

每個(gè)工具的介紹會(huì)分成簡(jiǎn)介、使用說明、圖形化方法三個(gè)部分。

每種工具的結(jié)果都會(huì)基于下面這段代碼:

#include <unistd.h>using namespace std;#define NUM 500000void init(int* int_array){ for(int i=0;i<NUM;i++){ int_array[i]=i; }}void accu(int* int_array,long& sum ){ for(int i=0;i<NUM;i++){ sum+=int_array[i]; usleep(3); }}int main(){ int int_array[NUM]; init(int_array); long sum=0; accu(int_array,sum);}

這段代碼在普通PC上執(zhí)行了31s,最大CPU使用率為8.3%

Perf1.1 簡(jiǎn)介

Perf是內(nèi)置于Linux內(nèi)核源碼樹中的性能剖析(profiling)工具。其基于事件采樣原理,以性能事件為基礎(chǔ),常用于性能瓶頸的查找與熱點(diǎn)代碼的定位。

1.2 使用

perf的使用可以分為兩種方式:

  • 直接使用perf啟動(dòng)服務(wù)

  • 掛接到已啟動(dòng)的進(jìn)程

  • 第一種方式不需要root權(quán)限,第二種方式需要root權(quán)限

    基于入門級(jí)使用這一前提,直接介紹一下使用方式:

    perf record -e cpu-clock -g ./run 或者 perf record -e cpu-clock -g -p 4522

    使用ctrl+c中斷perf進(jìn)程,或者在程序執(zhí)行結(jié)束后,會(huì)產(chǎn)生perf.data的文件,使用

    perf report

    會(huì)產(chǎn)生結(jié)果分析,如圖

    1.3 圖形化方法

    perf的結(jié)果可以生成火焰圖。生成火焰圖需要借助Flame Graph

    Flame Graph項(xiàng)目位于GitHub:

    https://github.com/brendangregg/FlameGraph

    clone代碼或者直接下載壓縮包到服務(wù)器上。以壓縮包為例,是一個(gè)命名為:FlameGraph-master.zip的文件,假設(shè)其解壓后的目錄為:/data

    基于1.2產(chǎn)生的perf.data,后續(xù)步驟如下:

    1、使用perf script工具對(duì)perf.data進(jìn)行解析perf script -i perf.data &> perf.unfold 2、將perf.unfold中的符號(hào)進(jìn)行折疊:/data/stackcollapse-perf.pl perf.unfold &> perf.folded 3、最后生成svg圖:/data/flamegraph.pl perf.folded > perf.svg

    生成的火焰圖如下:

    關(guān)于火焰圖的含義及分析網(wǎng)上有很多文章,這里不再贅述

    Gprof2.1 簡(jiǎn)介

    gprof用于監(jiān)控程序中每個(gè)方法的執(zhí)行時(shí)間和被調(diào)用次數(shù),方便找出程序中最耗時(shí)的函數(shù)。在程序正常退出后,會(huì)生成gmon.out文件,解析這個(gè)文件,可以生成一個(gè)可視化的報(bào)告

    2.2 使用方法

    使用gprof,需要在編譯時(shí),加入-pg選項(xiàng)

    另外只有在程序正常退出后才會(huì)生成gmon.out,kill進(jìn)程的方法是沒法生成gmon.out的。對(duì)于那些線程會(huì)一直run的服務(wù),需要修改代碼,讓程序在某個(gè)時(shí)間點(diǎn)停止。

    重新編譯后,正常啟動(dòng)程序即可;然后在程序運(yùn)行結(jié)束后,會(huì)生成gmon.out文件

    使用如下命令,生成報(bào)名文件(其中run是二進(jìn)制的名字):

    gprof -b run gmon.out >>report.txt

    report.txt打開如下圖所示:

    2.3 圖形化方法

    gprof的結(jié)果文件需要借助gprof2dot.py和graphviz來展示

    使用gprof2dot.py生成dot文件

    python gprof2dot.py report.txt >report.dot

    需要說明的是,這里要求服務(wù)器已經(jīng)安裝了python,并且要求gprof2dot.py與安裝的python版本匹配。這兩者是否匹配是一個(gè)需要運(yùn)氣、并且解決起來很無聊的事情,我的服務(wù)器上安裝的python是2.6.6,第一次從網(wǎng)上下載的gprof2dot-2017.9.19與python版本就不匹配,執(zhí)行會(huì)出錯(cuò)。目前使用的版本與2.6.6是兼容的,如果需要可以與我聯(lián)系。

    dot的打開需要graphviz工具,我是在windows下安裝的graphviz,這個(gè)工具下載很簡(jiǎn)單。下載后使用gvedit.ext打開前一個(gè)步驟產(chǎn)生的report.dot文件即可

    這個(gè)圖顯的有些萌萌噠,這是因?yàn)槲覀兊某绦驅(qū)懙谋容^簡(jiǎn)單,對(duì)于一般的業(yè)務(wù)而言,這個(gè)圖會(huì)比較復(fù)雜。

    Valgrind3.1 簡(jiǎn)介

    valgrind不是linux的原生工具,需要自行安裝。valgrind自身包含了多個(gè)工具:

    • Memcheck:用于內(nèi)存泄漏檢查

    • Callgrind:用于性能分析,會(huì)收集程序運(yùn)行時(shí)間和調(diào)用關(guān)系

    • 以及Cachegrind、Helgrind等

    這里我們主要使用的Callgrind工具

    3.2 使用方法

    首先需要安裝valgrind:

    http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2

    解壓安裝包后,順次執(zhí)行:./configue 、make、make install 就可以了

    使用valgrind來分析性能,必須使用valgrind來啟動(dòng)程序:

    valgrind --tool=callgrind --separate-threads=yes ./run

    --separate-threads是指是否按線程來分別統(tǒng)計(jì),如果不加,會(huì)將所有線程的結(jié)果打到一個(gè)文件里;否則會(huì)按線程分別打印到不同文件里。

    程序執(zhí)行結(jié)束后,會(huì)生成形如:callgrind.out.4263-01的文件。這個(gè)文件直接分析起來有些困難,必須借助圖形化的方式來瀏覽

    3.3 圖形化方法

    valgrind的圖形化需要借助kcachegrind.exe,大家可以自行下載,下載后在windows運(yùn)行即可。這是打開callgrind.out.4263-01的結(jié)果:

    4工具比較

    對(duì)于我們的需求:定位執(zhí)行時(shí)間最長(zhǎng)、占用CPU最多的函數(shù) 來說,這三個(gè)工具都可以達(dá)到目的。但這三者之間還是有一定的差距:

    4.1 啟動(dòng)方式

    Perf雖然可以掛接進(jìn)程但需要root權(quán)限。在普通權(quán)限下,Perf和Valgrind必須使用前綴啟動(dòng)的方式來啟動(dòng)程序,這在某種程度上會(huì)影響到程序的性能。我們?cè)趬簻y(cè)的過程中發(fā)現(xiàn)使用Valgrind啟動(dòng)的時(shí)候,可以支持的在線總?cè)藬?shù)比直接運(yùn)行程序要少很多。

    4.2 程序侵入

    Perf和Valgrind都不需要修改Makefile或者程序,但gprof需要重新編譯文件,并且對(duì)于線程一直run的服務(wù),還需要修改代碼讓其自然退出,這在一定程序上侵入了程序。但從對(duì)性能影響上來看,gprof可以最大限制的保留原程序的性能

    4.3 結(jié)果展示

    gprof的結(jié)果是一顆倒樹,這顆樹展示了從根到葉子的所有結(jié)點(diǎn)的時(shí)間消耗;perf的是一個(gè)金字塔,與gprof有異曲同工之妙;Valgrind的結(jié)果是一條單路,指出的是某條調(diào)用路徑上的時(shí)間消耗,并不是一個(gè)全局的展示。

    4.4 監(jiān)控原理

    這是一個(gè)很專業(yè)的話題,目前對(duì)三者的監(jiān)控原理還沒有摸的太透,所以這里暫時(shí)空著。大家有興趣可以先行研究。

    問答

    linux實(shí)時(shí)調(diào)度算法?

    Linux中的多線程處理?

    相關(guān)閱讀

    Linux 常用性能工具簡(jiǎn)介

    常見Linux調(diào)優(yōu)命令和工具

    性能優(yōu)化:Linux環(huán)境下合理配置大內(nèi)存頁(yè)

    ?


    此文已由作者授權(quán)騰訊云+社區(qū)發(fā)布,轉(zhuǎn)載請(qǐng)注明文章出處

    ?原文鏈接:https://cloud.tencent.com/developer/article/1063652

    轉(zhuǎn)載于:https://www.cnblogs.com/qcloud1001/p/8584077.html

    總結(jié)

    以上是生活随笔為你收集整理的Linux性能分析工具与图形化方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。