使用 gperf 分析内存和 CPU | 系统开发

本文最后更新于:2023年6月26日

使用 gperf 工具查看内存和 CPU 使用情况,先以分析内存为例介绍整个流程。

内存

安装

yum install google-perftools
yum install graphviz ghostscript # 输出 PDF 需要用到

运行

# 配置
export LD_PRELOAD=libtcmalloc.so
export HEAPPROFILESIGNAL=12 # 发送该信号以 dump 内存情况
export HEAPPROFILE=test.prof
export HEAP_PROFILE_ALLOCATION_INTERVAL=0 # 每分配一定内存自动 dump 一次,默认为 1 GB (1073741824 Bytes)
export HEAP_PROFILE_DEALLOCATION_INTERVAL=0
export HEAP_PROFILE_INUSE_INTERVAL=0
export HEAP_PROFILE_TIME_INTERVAL=0

# 运行
./main

# 向进程发送信号 dump 内存情况
kill -12 `pidof $binary_name`

数据分析

# PDF 形式
pprof main test.prof.0001.heap --pdf > res.pdf
# 文本形式
pprof main test.prof.0001.heap --text > res.txt
# 差异分析
pprof main test.prof.0001.heap --base=test.prof.0000.heap --pdf > res.pdf
# 交互模式分析
pprof main test.prof.0001.heap --base=test_log.0000.heap
# 交互模式分析未释放对象个数增量
pprof main test.prof.0001.heap --base=test_log.0000.heap --inuse_objects

文本形式的列含义:

% pprof ./main ./test.log.0001.heap --text
   255.6  24.7%  24.7%    255.6  24.7% GFS_MasterChunk::AddServer
   184.6  17.8%  42.5%    298.8  28.8% GFS_MasterChunkTable::Create
   176.2  17.0%  59.5%    729.9  70.5% GFS_MasterChunkTable::UpdateState
   169.8  16.4%  75.9%    169.8  16.4% PendingClone::PendingClone
    76.3   7.4%  83.3%     76.3   7.4% __default_alloc_template::_S_chunk_alloc
    49.5   4.8%  88.0%     49.5   4.8% hashtable::resize
  • 第一列:以 MB 为单位的内存分配情况
  • 第四列:所有的进程和它调用函数的内存之和
  • 第三列:第二列累加之和,如:第二行的第三列就是第一行的第二列加第二行的第二列
  • 第二、第五列:第一列和第四列的百分比表示

CPU

使用

CPU 使用的分析和内存非常接近,区别在于使用的动态库和环境变量。

# 配置
export LD_PRELOAD=./libprofiler.so 
export CPUPROFILESIGNAL=12
export CPUPROFILE=test.prof
pprof main test.prof.0 --pdf > res.pdf

还有一点不同之处:在分析内存时,发送信号会 dump 当前的内存使用情况;在分析 CPU 使用时,需要发送两次信号才会 dump,dump 出的信息是两次发送信号之间的时间段的 CPU 使用情况。

数据分析

以这张图为例,每个结点分为四个部分:

  • 类名
  • 函数名
  • 采样次数(百分比)
  • 整体采样次数(百分比)

比如说,上图中的 test_main_thread 函数,共采样到 200 次,其中 155 次是在执行该函数,其他 45 次是在执行其调用的其他函数。

参考

Google CPU Profiler 学习小结