
# 调用栈记录函数
DWS通过pv_memory_profiling(type int)和环境变量MALLOC_CONF，控制gaussdb进程中malloc等内存分配调用栈记录模块开启关闭、以及进程级内存调用栈输出等，使用流程如下图所示：
![](https://support.huaweicloud.com/sqlreference-911-dws/figure/zh-cn_image_0000002166613488.png "点击放大")
#### 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)
参数说明：控制gaussdb进程中malloc等内存分配函数的backtrace记录及输出。
取值范围：正整数，0\~3
表1pv_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, input 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
   ```
   ![](https://support.huaweicloud.com/sqlreference-911-dws/public_sys-resources/note_3.0-zh-cn.png)
   - 解析内存调用栈信息，需要依靠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)
```
