
# 内存管理函数
内存管理函数仅25.5.0及以上集群版本支持。
#### pgxc_total_memory_detail()
描述：用于查看所有后端actor节点的内存使用情况。
返回值类型：record
函数返回信息如下：
表1pgxc_total_memory_detail()输出结果的字段 
| 名称           | 类型      | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
|:---|:---|:---|
| nodename     | text    | 节点名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| memorytype   | text    | 内存的名称，包括以下几种： - max_process_memory：Aura集群实例所占用的内存大小。  - process_used_memory：Aura进程所使用的内存大小。  - max_dynamic_memory：最大动态内存。  - dynamic_used_memory：已使用的动态内存。  - dynamic_peak_memory：内存的动态峰值。  - dynamic_used_shrctx：最大动态共享内存上下文。  - dynamic_peak_shrctx：共享内存上下文的动态峰值。  - max_shared_memory：最大共享内存。  - shared_used_memory：已使用的共享内存。  - max_cstore_memory：列存所允许使用的最大内存。  - cstore_used_memory：列存已使用的内存大小。  - other_used_memory：其他已使用的内存大小。  - mmap_used_memory：mmap使用的内存大小。   |
| memorymbytes | integer | 内存使用的大小，单位MB。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   
#### shared_memory_context(actor_name cstring)
描述：查询指定actor进程中共享内存上下文的统计信息。
参数：actor_name，表示actor名称。
返回值类型：record
示例：
```
select * from shared_memory_context('coordinator1') order by totalsize desc limit 10;
             contextname             | level |             parent              | totalsize | freesize | usedsize
-------------------------------------+-------+---------------------------------+-----------+----------+----------
 Query resource track memory context |     2 | Workload manager memory context |  67174520 |    64320 | 67110200
 RawMemory                           |     1 | ProcessMemory                   |  23525840 |        0 | 23525840
 builtin proc name Lookup Table      |     2 | builtin_procGlobalMemoryContext |    425984 |   261152 |   164832
 ProcessMemory                       |     0 |                                 |    196608 |    76992 |   119616
 builtin pro Oid Lookup Table        |     2 | builtin_procGlobalMemoryContext |    196608 |    41664 |   154944
 PoolerMemoryContext                 |     1 | ProcessMemory                   |     73728 |    56832 |    16896
 Node Pool                           |     3 | PoolerCoreContext               |     73640 |    25888 |    47752
 ThreadGroup Hash Table              |     1 | ProcessMemory                   |     65536 |    39936 |    25600
 Aio Sub Memory Context 6            |     2 | Aio Memory Context              |     65536 |    63872 |     1664
 Aio Sub Memory Context 5            |     2 | Aio Memory Context              |     65536 |    63872 |     1664
(10 rows)
```
#### shared_memory_context_chunk(actor_name cstring, contextname char(64))
描述：查询指定actor、名字为contextname的共享内存上下文申请的所有chunk信息。
参数：
- actor_name， 指定actor的名字
- contextname，表示内存上下文名称。
返回值类型：record
示例：
```
select * from shared_memory_context_chunk('executor0_es_group', 'StreamInfoContext') ;
    parent     | level |      file_name       | line_number | chunk_size | request_count | total_size
---------------+-------+----------------------+-------------+------------+---------------+------------
 ProcessMemory |     1 | mcxt.cpp             |        1010 |       8192 |             1 |       8192
 ProcessMemory |     1 | streamThreadPool.cpp |          35 |       1024 |             1 |       1024
(2 rows)
```
#### pgxc_session_memory_detail()
描述：用于查看对应actor或者所有后端actor节点的线程内存使用情况，以MemoryContext维度来统计。
其中内存上下文"TempSmallContextGroup"，记录当前线程中所有内存上下文字段"totalsize"小于8192字节的信息汇总，并且内存上下文统计计数记录到"usedsize"字段中。所以在结果中，"TempSmallContextGroup"内存上下文中的"totalsize"和"freesize"是该线程中所有内存上下文"totalsize"小于8192字节的汇总总和，usedsize字段表示统计的内存上下文个数。
参数说明：
- pgxc_session_memory_detail()，无参数，查询CN和所有DN进程中所有线程的内存上下文的统计信息。
- pgxc_session_memory_detail(actor_name)，入参为actor_name，输出指定CN或DN进程中所有线程的内存上下文的统计信息。
返回值类型：record
函数返回信息如下：
表2pgxc_session_memory_detail字段 
| 名称          | 类型       | 描述                                                               |
|:---|:---|:---|
| sessid      | text     | 线程启动时间+线程标识（字符串信息为timestamp.threadid）。                           |
| sesstype    | text     | 线程名称。                                                            |
| contextname | text     | 内存上下文名称。                                                         |
| level       | smallint | 当前上下文在整体内存上下文中的层级。                                               |
| parent      | text     | 父内存上下文名称。                                                        |
| totalsize   | bigint   | 当前内存上下文的内存总数，单位Byte。                                             |
| freesize    | bigint   | 当前内存上下文中已释放的内存总数，单位Byte。                                         |
| usedsize    | bigint   | 当前内存上下文中已使用的内存总数，单位Byte；"TempSmallContextGroup"内存上下文中该字段含义为统计计数。 |
   
#### session_memory_context_chunk(actor_name cstring, tid int64, contextname char(64))
描述：查询指定actor上某个线程创建的某个内存上下文申请的所有chunk信息。
参数说明：
- actor_name， 表示actor名称。
- tid，表示线程ID。
- contextname，表示内存上下文名称。
返回值类型：record
示例：
```
select * from session_memory_context_chunk('executor0_es_group', 139736895414560, 'Node Pool') order by total_size desc ;
      parent       | level |  file_name   | line_number | chunk_size | request_count | total_size
-------------------+-------+--------------+-------------+------------+---------------+------------
 PoolerCoreContext |     3 | dynahash.cpp |         147 |       2048 |             1 |       2048
 PoolerCoreContext |     3 | dynahash.cpp |         147 |        256 |             1 |        256
 PoolerCoreContext |     3 | dynahash.cpp |         147 |      32584 |             1 |      32584
 PoolerCoreContext |     3 | dynahash.cpp |         147 |       4096 |             3 |      12288
(4 rows)
```
jemalloc_heap_stats(actor_name cstring)
描述：查询jemalloc提供的内存统计信息。
参数：actor_name， 表示actor名称。
返回值类型：record
示例：
```
select * from jemalloc_heap_stats( 'coordinator1' );
  actor_name  |
  stats
--------------+-------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------
 coordinator1 | ___ Begin jemalloc statistics ___
              | Version: "5.2.1-6-gd04ec97dec5e84ac24f32c29053aa94479402b6d"
              | Build-time option settings
              |   config.cache_oblivious: true
              |   config.debug: false
              |   config.fill: true
              |   config.lazy_lock: false
              |   config.malloc_conf: "tcache:true,background_thread:true,percpu_arena:phycpu,dirty_decay_ms:1000,muzzy_decay_ms:1000"
              |   config.opt_safety_checks: false
              |   config.prof: false
              |   config.prof_libgcc: false
              |   config.prof_libunwind: false
              |   config.stats: true
              |   config.utrace: false
```
#### jemalloc_heap_profiling(actor_name cstring, type int)
功能说明：对Aura actor进程中malloc等内存分配进行采样，并输出采样结果。
表3jemalloc_heap_profiling参数的含义 
| 参数         | 类型  | 含义                                                                                                                                   |
|:---|:---|:---|
| actor_name | 字符串 | actor名称。                                                                                                                             |
| type       | 整数  | 1：开启内存trace，记录malloc等调用栈信息。 0：关闭内存trace，返回本次所记录的malloc等调用栈的采样信息。 |
   
返回值类型：
- actor_name：actor名称。
- profiling：内存分配采样信息。
备注：
- 如果失败提示信息为"Memory profiling failed, check if $MALLOC_CONF contain 'prof:true'."，说明未设置环境变量MALLOC_CONF=prof:true，原因是未使用带内存采样功能的jemalloc库。请在使用gov_client启动CN的参数中添加-j选项。
- 如果失败提示信息为"Type %d is not supported. The valid range is 0-1."，说明用户输入参数错误，正确数值为0或1。
 
#### 输出内存调用栈信息
操作步骤：
1. 输出内存调用栈信息，在Aura进程所在目录输出trace文件。 
   ```
   SELECT profiling FROM jemalloc_heap_profiling('coordinator1', 0);
   ```
   
   
2. 将查询结果另存为trace文件。
3. 使用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/sqlref-aura-aidatalake/public_sys-resources/note_3.0-zh-cn.png)
   - 解析内存调用栈信息，需要依靠Aura源码进行分析，需要将trace文件返回给开发工程师进行分析。
   
   - 分析trace文件，需要使用jeprof工具，该工具由Jemalloc生成。在常规使用中，需要依赖perl环境，如果需要生成pdf调用图，需要安装与操作系统匹配的GraphViz工具。
    
   
   
 
#### 示例
使用gov_client -j重新启动数据库。
在数据库运行期间，打开内存trace记录功能：
```
SELECT profiling FROM jemalloc_heap_profiling('coordinator1', 1);
```
在数据库运行期间，关闭内存trace记录功能：
```
SELECT profiling FROM jemalloc_heap_profiling('coordinator1', 0);
```
将查询结果复制到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
```
