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

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

内存

安装

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

运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 配置
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`

数据分析

1
2
3
4
5
6
7
8
9
10
# 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

文本形式的列含义:

1
2
3
4
5
6
7
% 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 使用的分析和内存非常接近,区别在于使用的动态库和环境变量。

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

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

数据分析

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

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

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

参考

Google CPU Profiler 学习小结

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

http://www.zh0ngtian.tech/posts/83d3d94f.html

作者

zhongtian

发布于

2020-11-05

更新于

2023-12-16

许可协议

评论