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 查看文件信息
    v-valgrind搭配massif、vgdb分析ceph-mon内存_第1张图片

    坐标图解如下

    • 坐标图中":“表示普通快照,”@“表示详细快照,”#"表示峰值快照,坐标左下角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选项打开栈分析 )
    • 详细快照详解
      除了基本计数(和普通快照一样)之外,它还提供了一个分配树,准确地指出这些堆内存是由哪些代码分配的,如下:
      v-valgrind搭配massif、vgdb分析ceph-mon内存_第2张图片
    • 峰值快照即和详细快照内容一样,标记有peak 字样的快照序号

    默认情况下,Massif只分析堆内存,即函数malloc,calloc,realloc,memalign,new和其他一些 类似函数的占用内存。这意味着它不直接分析较低级别的系统调用,如 mmap、 mremap、brk。它也不分析代码段、数据段和BSS段(约等于全局区域)的大小,所以它所分析显示的数字远小于top显示的数字,这里我们可以通过参数–pages-as-heap=yesmmap和类似系统调用函数分配的每个“页面”都被视为一个不同于常规堆块的“块”来分析

  • 设置--pages-as-heap=yesms_print输出大部分不变,一个区别时详细快照的开头部分的变化(heap allocation functions) malloc/new/new[], --alloc-fns, etc变成
    (page allocation syscalls) mmap/mremap/brk, --alloc-fns, etc

massif的详细参数

  • --heap= [default: yes]是否启动堆分析,默认是yes
  • --heap-admin=[default:8] 设置每个块的管理字节数,属于快照详解中额外字节数
  • --stacks= [default: no] 是否启动栈内存分析,启动后会减慢Massif,默认是关闭
  • --pages-as-heap= [default: no]打开之后支持分析页面级别的内存而非只有malloc的块层面的内存
  • --depth= [default: 30] 设置详细快照中分配树的最大深度,增加它将使Massif运行得更慢,使用更多内存,并产生更大的输出文件
  • --alloc-fn=指定封装堆内存分配函数的名字
    注意:只有该函数处于函数调用栈的顶部条目时才可以被这样对待。
    如果malloc1封装了函数malloc,并且malloc2又封装了malloc1,则只指定 --alloc-fn=malloc2将不起作用.需要指定–alloc-fn=malloc1;虽然这样不是很方便,但是如果massif已经不再分析函数调用栈了,我们只需要查看我们指定的函数就可以了,并不需要浏览所有的内存分配函数
  • --ignore-fn= 指定堆分析时,忽略的函数,如mallocnew–alloc-fn指定的函数等,编写C ++函数名的规则与–alloc-fn相同
  • --threshold= [default: 1.0]设置详细快照中分配树是否打印出来代码详细位置的阈值,低于该阈值时,不打印,默认是1.0%
    v-valgrind搭配massif、vgdb分析ceph-mon内存_第3张图片
  • --peak-inaccuracy= [default: 1.0]针对峰值快照的选项,当内存增加到比前一个峰值至少1.0%(默认值)时,才将这时的内存进行详细的快照,更新为新的峰值。否则内存增加一点点就记录为峰值会影响Massif的性能
  • --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的连接,监听端口变为如下状态
    v-valgrind搭配massif、vgdb分析ceph-mon内存_第4张图片
进行massif的monitor指令调试
  • monitor snapshot | 将当前valigrand抓的数据创建一个快照,并且可以保存到指定文件。如果不指定文件,则默认为massif.vgdb.out
    执行 gdb中执行monitor snapshot test.out
    v-valgrind搭配massif、vgdb分析ceph-mon内存_第5张图片
  • monitor detailed_snapshot [filename] 保存一个详细快照到指定文件
  • monitor all_snapshots [filename]将目前抓取的所有快照都保存到指定文件
  • monitor xtmemory [ default xtmemory.kcg.%p.%n]请求massif产生一个xtree的堆分析报告,由一个函数栈集合组成的可执行树
    一般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登录到自己服务器上:
    v-valgrind搭配massif、vgdb分析ceph-mon内存_第6张图片
  • 同时打开以上xmanager-Passive软件
  • 在自己服务器上直接执行massif-visualizer massif.out.[PID] ·这个文件即可生成如下火焰图,其中最右侧函数调用栈,可以点击+号来查看调用栈函数
    v-valgrind搭配massif、vgdb分析ceph-mon内存_第7张图片

你可能感兴趣的:(分布式存储:ceph技能树,#,linux操作系统:常用命令,#,ceph运维:常用工具)