调用栈记录函数
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
pv_memory_profiling 取值 |
含义 |
---|---|
0 |
关闭内存trace,不记录malloc等调用栈信息。 |
1 |
开启内存trace,记录malloc等调用栈信息。 |
2 |
输出malloc等调用栈的trace日志。
|
3 |
输出内存统计信息。
|
返回值类型: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.”请联系技术支持工程师提供技术支持。
输出内存调用栈信息
操作步骤:
- 输出内存调用栈信息,在GaussDB进程所在目录输出trace文件:
1
SELECT * FROM pv_memory_profiling(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工具。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
--系统管理员用户登录,设置环境变量,启动数据库。 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) |