# 内存资源监控
#### 内存监控
DWS支持在监控面板(DMS)查看集群内存使用情况，详情参考[在监控面板(DMS)查看DWS集群监控](https://support.huaweicloud.com/mgtg-dws/dws_01_00014.html)章节。
DWS也提供了监控整个集群内存使用状态的视图：
查询pgxc_total_memory_detail视图，必须具有sysadmin权限。
```
SELECT * FROM pgxc_total_memory_detail;
```
如果查询该视图时出现以下错误，请开启内存管理功能（该功能由GUC参数enable_memory_limit控制，该参数默认开启。若确认参数已关闭，请联系技术支持开启）。
```
SELECT * FROM pgxc_total_memory_detail;
ERROR:  unsupported view for memory protection feature is disabled.
CONTEXT:  PL/pgSQL function pgxc_total_memory_detail() line 12 at FOR over EXECUTE statement
```
用户可通过DWS控制台修改max_process_memory参数，调整数据库节点可用的最大物理内存，方法如下：
1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
2. 在左侧导航栏中，单击**"集群 \> 集群列表"**。
3. 在集群列表中找到所需要的集群，单击集群名称，进入**"集群详情"**页面。
4. 单击"参数修改"页签，并在"参数列表"模块修改"max_process_memory"参数值，修改建议参考[max_process_memory](https://support.huaweicloud.com/devg-911-dws/dws_04_0893.html#ZH-CN_TOPIC_0000002202094753__sadc1e0e8c1c246a4a6cad3967deebaad)，然后单击**"** **保存"**。
5. 在**"修改预览** **"** 窗口，确认修改无误后，单击**"保存"**。
 
#### 共享内存监控
用户可以通过视图pg_shared_memory_detail查询共享内存上下文信息：
```
SELECT * FROM pg_shared_memory_detail;
           contextname           | level |             parent              | totalsize | freesize | usedsize 
---------------------------------+-------+---------------------------------+-----------+----------+----------
 ProcessMemory                   |     0 |                                 |     24576 |     9840 |    14736
 Workload manager memory context |     1 | ProcessMemory                   |   2105400 |     7304 |  2098096
 wlm collector hash table        |     2 | Workload manager memory context |      8192 |     3736 |     4456
 Resource pool hash table        |     2 | Workload manager memory context |     24576 |    15968 |     8608
 wlm cgroup hash table           |     2 | Workload manager memory context |     24576 |    15968 |     8608
(5 rows)
```
该视图列举了内存使用的上下文名称、级别、上级内存上下文、共享内存总大小等。
另外，在数据库中，GUC参数"memory_tracking_mode"用来设置内存信息统计的模式，共支持四种模式：
- none，不启动内存统计功能。
- normal，仅做内存实时统计，不生成文件。
- executor，生成统计文件，包含执行层使用过的所有已分配内存的上下文信息。 当为executor模式时，将在DN进程的pg_log目录下生成csv格式文件，命名方式为：memory_track_\<DN名称\>_query_\<queryid\>.csv。作业执行时，执行器postgres线程和所有stream线程执行的算子信息，都将输入该文件。
  文件内容根据以下内容组成示例如下：
  ```
  0, 0, ExecutorState, 0, PortalHeapMemory, 0, 40K, 602K, 23
  1, 3, CStoreScan_29360131_25, 0, ExecutorState, 1, 265K, 554K, 23
  2, 128, cstore scan per scan memory context, 1, CStoreScan_29360131_25, 2, 24K, 24K, 23
  3, 127, cstore scan memory context, 1, CStoreScan_29360131_25, 2, 264K, 264K, 23
  4, 7, InitPartitionMapTmpMemoryContext, 1, CStoreScan_29360131_25, 2, 31K, 31K, 23
  5, 2, VecPartIterator_29360131_24, 0, ExecutorState, 1, 16K, 16K, 23
  0, 0, ExecutorState, 0, PortalHeapMemory, 0, 24K, 1163K, 20
  1, 3, CStoreScan_29360131_22, 0, ExecutorState, 1, 390K, 1122K, 20
  2, 20, cstore scan per scan memory context, 1, CStoreScan_29360131_22, 2, 476K, 476K, 20
  3, 19, cstore scan memory context, 1, CStoreScan_29360131_22, 2, 264K, 264K, 20
  4, 7, InitPartitionMapTmpMemoryContext, 1, CStoreScan_29360131_22, 2, 23K, 23K, 20
  5, 2, VecPartIterator_29360131_21, 0, ExecutorState, 1, 16K, 16K, 20
  ```
  其中各字段分别为：输出顺序号、线程内分配内存上下文的顺序号、当前内存上下文的名称、父内存上下文的输出顺序号、父内存上下文的名称、内存上下文树形层次级别号、当前内存上下文使用的内存峰值、当前内存上下文及其所有子内存上下文使用的内存峰值、当前线程所在query的plannodeid。
  在本例中，记录"1, 3, CStoreScan_29360131_22, 0, ExecutorState, 1, 390K, 1122K, 20"和Explain Analyze的对应关系如下：
  - CstoreScan_29360131_22代表CstoreScan算子。
  
  - 1122K代表CstoreScan算子的PeakMemory。
   
- fullexec，生成文件包含执行层申请过的所有内存上下文信息。 当设置为fullexec模式时，输出信息和executor模式相同，但可能增加部分内存上下文分配信息，因为所有申请内存（无论是否申请成功）相关的信息都会被打印出来。由于仅记录内存申请信息，故记录中内存上下文使用的峰值均为0。
  
 
