文章

总结:使用 gperftools 进行性能分析

1. 安装 gperftools

使用 gperftools Release页面 下载(不要使用git clone,且不要使用cmake编译,编译不生成pprof工具),编译命令:

1
2
./configure
make && make install

安装graphviz

1
sudo apt-get install graphviz

2. 将 gperftools 链接进待测试程序

如何在CMake中查找gperftools的路径,参考笔记 CMake 编写FindPackage 模块: posts/2024-06-21-cmake-find_package.md,添加自定义CMake Find Package模块,并在CMakeLists.txt中添加find_package(gperftools),即可找到gperftools的路径。

编译脚本添加如下:

1
2
3
4
5
6
7
8
9
10
11
option(ENABLE_PROFILER "Enable google perftools" ON)
message(STATUS "ENABLE_PROFILER: ${ENABLE_PROFILER}")
if(ENABLE_PROFILER)
  set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake;${CMAKE_MODULE_PATH}")
  find_package(Gperftools REQUIRED)
  set(PROFILER_LIBS ${GPERFTOOLS_PROFILER_LIBRARY})
  message(STATUS "PROFILER_LIBS: ${PROFILER_LIBS}")
  add_definitions("-DHAVE_PROFILER")
else()
  set(PROFILER_LIBS "")
endif()

使能frame-pointer:

1
2
3
4
5
6
7
if(ENABLE_PROFILER)
  message(STATUS "enable profiler")
  target_compile_options(${target_test} PRIVATE -fno-omit-frame-pointer)
  target_link_options(${target_test} PRIVATE -fno-omit-frame-pointer)
  # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer")
  # set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fno-omit-frame-pointer")
endif()

3. 使用 gperftools 分析程序性能

运行被测试程序:

1
2
3
4
CPUPROFILE=test_flow_benchmark.prof CPUPROFILE_FREQUENCY=500 ./test --gtest_filter=FlowBenchMarkTest10/FlowBenchMarkTest.*

# 生成pdf报告
pprof --pdf ./server server.prof > perf.pdf

4. 使用 GNU gprof 分析程序性能

1
2
target_compile_options(${target_test} PRIVATE -pg -g)
  target_link_options(${target_test} PRIVATE -pg -g)

gprof 不支持多线程应用,多线程下只能采集主线程性能数据。多线程需要重写pthread_create()。参考:Linux性能优化gprof使用

参考

  1. gperftools
  2. gperftools文档 – CPU profiler
  3. 使用 gperftools 分析程序性能
  4. Profiler – 链接选项
  5. Linux下使用gperftools
  6. gperftools 的安装与使用
本文由作者按照 CC BY 4.0 进行授权