v-valgrind搭配massif、vgdb分析ceph-mon内存
文章目录
- valgrind 搭配的相关工具
- 安装massif-visualizer
- 抓取massif分析Ceph-mon运行时内存数据
- massif的详细参数
- vgdb配合valgrind结合massif的相关monitor指令调试进程
- 打开vgdb调试
- 进行massif的monitor指令调试
- massif-visualizer 图形可视化massif format文件
valgrind 搭配的相关工具
环境:centos 7.0
安装massif-visualizer
该工具是用来生成valgrind可视化和图形可视化的内存分析结果
- 安装
valgrind
yum install valgrind - 安装
massif-visualizer
进入massif-visualizer:github 下载源码包 或者直接git clone https://github.com/KDE/massifvisualizer
解压后进入其目录执行如下命令cd massif-visualizer mkdir build cd build cmake .. make sudo make install
抓取massif分析Ceph-mon运行时内存数据
-
systemctl stop ceph-mon@node1停止mon守护进程 -
valgrind --tool=massif /usr/bin/ceph-mon -f --cluster ceph --id node1 使用valgrind的massif工具启动ceph-mon
-
监控已经开始,并且可以top下看到该进程在运行

-
执行一段时间之后
ctrl + c停止运行,即可在当前目录下生成一个massif.out.[进程ID]的文件

-
使用
ms_print massif.out.21943查看文件信息

坐标图解如下
- 坐标图中":“表示普通快照,”@“表示详细快照,”#"表示峰值快照,坐标左下角Number of snapshots:80是快照总数量
Detailed snapshots: [2, 14, 33, 37, 43, 46, 50, 52, 62, 72, 73 (peak)]
- 普通快照详解
- n:快照编号
- time(i):快照采集时间,(i)括号中的i表示时间单位是运行的指令数,在执行Massif分析时,添加了参数–time-unit=i
- total(B):总内存消耗量
- useful-heap(B):可用堆内存的字节数,即程序申请内存时,指定的数量
- extra-heap(B):额外堆内存的字节数,包括管理内存增加的字节(默认是8,可以使用–heapadmin 选项来重新设定)和为了对齐多出的字节(通常是8或16,可以使用–alignment选项来重新设定)
- stacks(B):栈的大小,默认情况下,栈分析是关闭的,因为它会大大降低Massif的速度。因此,示例中的表示栈大小的列为零(可以使用–stacks=yes选项打开栈分析 )
- 详细快照详解
除了基本计数(和普通快照一样)之外,它还提供了一个分配树,准确地指出这些堆内存是由哪些代码分配的,如下:

- 峰值快照即和详细快照内容一样,标记有peak 字样的快照序号
默认情况下,Massif只分析堆内存,即函数malloc,calloc,realloc,memalign,new和其他一些 类似函数的占用内存。这意味着它不直接分析较低级别的系统调用,如 mmap、 mremap、brk。它也不分析代码段、数据段和BSS段(约等于全局区域)的大小,所以它所分析显示的数字远小于top显示的数字,这里我们可以通过参数
–pages-as-heap=yesmmap和类似系统调用函数分配的每个“页面”都被视为一个不同于常规堆块的“块”来分析 -
设置
--pages-as-heap=yes后ms_print输出大部分不变,一个区别时详细快照的开头部分的变化(heap allocation functions) malloc/new/new[], --alloc-fns, etc变成
(page allocation syscalls) mmap/mremap/brk, --alloc-fns, etc
massif的详细参数
--heap=是否启动堆分析,默认是yes[default: yes] --heap-admin=设置每个块的管理字节数,属于快照详解中额外字节数[default:8] --stacks=是否启动栈内存分析,启动后会减慢Massif,默认是关闭[default: no] --pages-as-heap=打开之后支持分析页面级别的内存而非只有malloc的块层面的内存[default: no] --depth= [default: 30]设置详细快照中分配树的最大深度,增加它将使Massif运行得更慢,使用更多内存,并产生更大的输出文件--alloc-fn=指定封装堆内存分配函数的名字
注意:只有该函数处于函数调用栈的顶部条目时才可以被这样对待。
如果malloc1封装了函数malloc,并且malloc2又封装了malloc1,则只指定 --alloc-fn=malloc2将不起作用.需要指定–alloc-fn=malloc1;虽然这样不是很方便,但是如果massif已经不再分析函数调用栈了,我们只需要查看我们指定的函数就可以了,并不需要浏览所有的内存分配函数--ignore-fn=指定堆分析时,忽略的函数,如malloc、new或–alloc-fn指定的函数等,编写C ++函数名的规则与–alloc-fn相同--threshold=设置详细快照中分配树是否打印出来代码详细位置的阈值,低于该阈值时,不打印,默认是1.0%[default: 1.0]

--peak-inaccuracy=针对峰值快照的选项,当内存增加到比前一个峰值至少1.0%(默认值)时,才将这时的内存进行详细的快照,更新为新的峰值。否则内存增加一点点就记录为峰值会影响Massif的性能[default: 1.0] --time-unit设置Massif分析的时间单位。有三种:按照程序运行的指令数、按照时间(毫秒)、按照申请、释放的字节数变化。最后一种对于小程序和测试时非常有用,因为它的复现性比较好--detailed-freq= [default: 10]设置详细快照的频率。当设置为1(–detailed-freq=1)时,每个快照都被记录成详细的--max-snapshots= [default: 100]设置最大快照数。如果设置为N,对于除非常小的程序(程序小到它全部快照数不超过默认值)外,最终的快照数将介于N / 2和N之间–massif-out-file= [default: massif.out.%p]将Massif分析数据写入指定file 而不是默认输出文件massif.out。文件名中可以添加 %p和%q用来加入进程ID和%q后指定环境变量的内容


vgdb配合valgrind结合massif的相关monitor指令调试进程
打开vgdb调试
- 目标机器执行valgrind监控执行进程的运行,并打开
vgdb
valgrind --vgdb=yes --tool=massif --pages-as-heap=yes --massif-out-file=hello.%p /usr/bin/ceph-mon -f --cluster ceph --id node1 - 复制该设备的一个终端,设置vgdb的监听端口运行:
vgdb --port=1234

- 再次复制一个终端,执行
gdb /usr/bin/ceph-mon(your program)
输入:target remote 10.192.55.6:1234(targetip:port)即在gdb中建立与valgrindserver的连接,监听端口变为如下状态

进行massif的monitor指令调试
monitor snapshot |将当前valigrand抓的数据创建一个快照,并且可以保存到指定文件。如果不指定文件,则默认为massif.vgdb.out
执行 gdb中执行monitor snapshot test.out

monitor detailed_snapshot [filename]保存一个详细快照到指定文件monitor all_snapshots [filename]将目前抓取的所有快照都保存到指定文件monitor xtmemory [请求massif产生一个xtree的堆分析报告,由一个函数栈集合组成的可执行树default xtmemory.kcg.%p.%n]
一般xtree会有两种格式:-
callgrind Format
该格式可以由两种可视化工具打开callgrind_annotate在Linux终端下伴随着valgrind安装的工具,会打印出一个排序好的函数列表,但是使用该命令时一定要输入指定xtree的文件参数:--inclusive=yes- 可视化图形界面来显示数据,需要安装工具KCachegrind
-
massif Format
需要在valgrind运行时指定参数--xtree-memory=alloc,会生成两种信息的执行树文件(curB,curBk)指定参数--xtree-memory=full会给出最详细的执行树文件(包含六个参数)curB:当前分配的Byte数量,每次产生空间分配都会导致该值的叠加,只有一个块空间释放之后它才会降低 curBk:表示curB分配的次数,每次分配的时候它的值+1,相反释放的时候就-1 totB:到目前为止总共分配的内存空间Byte,只增加 totBk:表示totB分配的次数,分配一次它的值+1,同样只增加 totFB:到目前为止总共释放的空间Byte,只增加 totFBk:到目前为止总共释放的次数以上参数应满足:curB =totB - totFB
此时生成的
xtree文件可以由ms_print打开
-
massif-visualizer 图形可视化massif format文件
- 需要在个人PC上下载
xmanange系列软件安装成功后打开xshell登录到自己服务器上:

- 同时打开以上
xmanager-Passive软件 - 在自己服务器上直接执行massif-visualizer massif.out.[PID] ·这个文件即可生成如下火焰图,其中最右侧函数调用栈,可以点击+号来查看调用栈函数

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
