更新时间:2022-08-16 GMT+08:00

调用栈记录函数

GaussDB(DWS)通过pv_memory_profiling(type int)和环境变量MALLOC_CONF,控制malloc等内存分配调用栈记录模块开启关闭、以及内存调用栈输出等,使用流程如下图所示:

MALLOC_CONF

环境变量MALLOC_CONF用于控制监控模块是否开启,位于${BIGDATA_HOME}/mppdb/.mppdbgs_profile文件内,默认开启。需注意:

  • 修改此环境变量变化,需要重启数据库。
  • 如果在集群中启用了om_monitor,完成环境变量设置后,先重启om_monitor进程后,然后重启数据库,使得开关生效。
  • 该环境变量可以设置在集群所有服务器中,也可以仅设置在需要开启模块的个别服务器中,对GaussDB进程而言,各进程是根据各自MALLOC_CONF环境变量,控制模块是否打开。

MALLOC_CONF开启和关闭命令:

  • 开启监控模块:
    export MALLOC_CONF=prof:true
  • 关闭监控模块:
    export MALLOC_CONF=prof:false

pv_memory_profiling (type int)

参数说明:控制内核malloc等内存分配函数的backtrace记录及输出。

取值范围:正整数,0~3

表1 pv_memory_profiling取值含义

pv_memory_profiling

取值

含义

0

关闭内存trace,不记录malloc等调用栈信息。

1

开启内存trace,记录malloc等调用栈信息。

2

输出malloc等调用栈的trace日志。

  • 输出路径为:/proc/pid/cwd指向的目录,pid为gaussdb进程ID。
  • 输出日志命名规则为:jeprof.<pid>.*.heap,其中pid表示GaussDB进程ID,*表示trace日志输出的序号,序号唯一。如:jeprof.195473.0.u0.heap

3

输出内存统计信息。

  • 输出路径为:/proc/pid/cwd指向的目录,pid为gaussdb进程ID。
  • 命名规则为节点名称+进程id+时间+“heap_stats”+.out。该文件可用vim直接打开。

返回值类型:boolean

备注:

  • 如果成功,函数返回true,否则返回false,返回相关提示信息。
  • 如果失败提示信息为“Memory profiling failed, check if $MALLOC_CONF contain 'prof:true'.”,说明未设置MALLOC_CONF=prof:true的情况下,使用了本模块,需要设置环境变量即可解决。
  • 如果失败提示信息为“Type %d is not supported. The valid range is 0-3.”,说明用户输入参数错误,正确数值为0,1,2,3。
  • 如果失败提示信息为“Memory profiling failed, inputed type is %d, failed number is %d.”请联系技术支持工程师提供技术支持。

输出内存调用栈信息

操作步骤:

  1. 输出内存调用栈信息,在GaussDB进程所在目录输出trace文件:

    select * from pv_memory_profiling(2);

  2. 使用jemalloc中提供的jeprof工具,解析日志信息:

    方式1:以text格式输出。
    jeprof --text --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 >prof.txt

    方式2:以pdf格式输出。

    jeprof --pdf --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 > prof.pdf
    • 解析内存调用栈信息,需要依靠GaussDB源码进行分析,需要将trace文件返回给研发工程师,进行分析。
    • 分析trace文件,需要使用jeprof工具,该工具由Jemalloc生成。在常规使用中,需要依赖perl环境,如果需要生成pdf调用图,需要安装与操作系统匹配的GraphViz工具。

示例

--系统管理员用户登录,设置环境变量,启动数据库。
export MALLOC_CONF=prof:true

--在数据库运行期间,关闭内存trace记录功能。
select pv_memory_profiling(0);
pv_memory_profiling
----------------------------
t
(1 row)

--在数据库运行期间,打开内存trace记录功能。
select pv_memory_profiling(1);
pv_memory_profiling
----------------------------
t
(1 row)

--输出内存trace记录功能。
select pv_memory_profiling(2);
pv_memory_profiling
----------------------------
t
(1 row)

--在GaussDB进程所在目录输出trace文件,以text格式或PDF格式输出。
jeprof --text --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 >prof.txt
jeprof --pdf --show_bytes $GAUSSHOME/bin/gaussdb trace文件1 > prof.pdf

--输出内存统计信息。
执行以下命令,在GaussDB进程所在目录输出内存统计文件,可直接读取。
select pv_memory_profiling(3);
pv_memory_profiling
----------------------------
t
(1 row)