使用 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 次是在执行其调用的其他函数。
参考
评论系统采用 utterances ,加载有延迟,请稍等片刻。