Stories

Detail Return Return

使用gperftools對C++程序進行profile定位性能瓶頸 - Stories Detail

本文將要學習如何使用gperftools工具定位C/C++程序的性能瓶頸,並用kcachegrind工具進行可視化展示。

gperftools簡介

gperftools(Google Performance Tools)是由谷歌開源的性能分析工具,能夠對程序進行profile,通俗的講就是能夠以一定的頻率對程序的堆棧進行採樣,採樣的次數越高,説明這個堆棧對應的代碼越熱。這個功能對於定位性能瓶頸十分有用。
本文選用gperftools的原因有幾點:
(1)非侵入性,也就是不用改應用代碼;
(2)對應用性能影響相對小,對比valgrind等工具;
(3)支持分析多線程程序。
注:此工具的安裝和詳細信息請參考官方網站。

示例代碼

#include <iostream>
using namespace std;
void func2()
{
    static int i = 0;
    ++i;
}
void func3()
{
    static int i = 0;
    ++i;
}
void func1()
{
    for (;;) {
        for (int j = 0; j < 3; ++j) {
            func2();             
        }
        func3();                 
    }
}
int main()
{
    func1();
    return 0;
}

操作系統:Linux
g++版本:9.3.1
編譯命令: g++ test.cpp -o test -g
代碼分析:以上代碼中main函數調用func1函數,在func1函數中無限循環調用func2和func3函數。

熱點定位

步驟一:運行示例程序,以LD_PRELOAD gperftools動態庫的方式

[root@fedora-36 test]# LD_PRELOAD="/usr/local/lib/libprofiler.so" CPUPROFILE=prof.out CPUPROFILESIGNAL=12 CPUPROFILE_FREQUENCY=10000 ./test 2>&1 > /dev/null
Using signal 12 as cpu profiling switch

其中,各項參數的解釋如下,您可根據自己實際情況進行設置:
(1)可執行程序名:test
(2)gperftools動態庫:/usr/local/lib/libprofiler.so
(3)採樣輸出的文件名:prof.out
(4)控制採樣開始、結束的Linux信號:12
(5)採樣頻率:10000次/秒

步驟二:開始採樣

使用向被採樣程序發送linux信號的方式。若應用程序已經將Linux信號截獲,則無法採樣,需要修改應用程序不截獲Linux信號。

命令:kill -12 PID
注:PID是被採樣的程序的進程id,需要用實際的pid進行替換。

步驟三:結束採樣

大約等待10秒左右,再次向被採樣程序發送linux信號12,以結束採樣。

命令:kill -12 PID

此時,查看當前目錄,會發現生成了一個名為prof.out.0的文件
生成採樣文件

步驟四:生成可視化的採樣文件

命令1:pprof test prof.out.0
格式:pprof 被採樣的可執行程序名 生成的採樣文件名
注:pprof程序是gperftools自帶的程序
命令2:callgrind callgrind.out
注:生成callgrind文件,用來使用kcachegrind工具進行可視化展示

生成可視化的採樣文件

步驟五:使用kcachegrind工具展示採樣結果

kcachegind工具支持Windows和Linux操作系統。操作較簡單,只需要將步驟四中生成的callgrind.out文件導入工具中即可。下圖為採樣結果在kcachegrind軟件中的可視化展示。
一、導入採樣文件至kcachegrind軟件
導入採樣文件二、查看代碼熱點信息

採樣結果展示圖

從上圖可以看出函數的調用關係,main函數調用func1,func1調用func2和func3。其中,func1中較大的熱點如下:
(1)第16行的for循環,佔用了49.74%,佔比最高;
(2)第17行的func2函數,佔用了31.59%。

結束語

通過本文的學習,我們掌握瞭如何對C/C++程序進行profile,能夠幫助我們細粒度地分析程序熱點。建議讀者實際操作一下,掌握這項技能。
歡迎關注vx公眾號【Hankin-Liu的技術研究室】,持續分享軟件性能測試、調優、編程技巧、軟件調試技巧相關內容,輸出有價值、有沉澱的技術乾貨。

user avatar ZhongQianwen Avatar donnytab Avatar jkkang Avatar qiyuxuanangdelvdou Avatar aixiaodewulongcha_ehoerm Avatar thinkerdjx Avatar iceblue Avatar goodcitizen Avatar wei-boke Avatar duwenlong Avatar zhongyq-with-yuanqiu Avatar Reimual Avatar
Favorites 13 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.