# 内存日志
内存日志是保存数据库进程动态内存使用超过设定阈值，或动态内存波动超过设定阈值，或统计周期达到设定值时生成的内存上下文统计信息，由GUC参数memory_trace_level控制是否记录，默认为level1记录日志；由GUC参数memory_log_config设置更多功能，如配置动态内存使用量百分比阈值、内存波动百分比阈值、统计周期、内存上下文top数量、SQL语句top数量。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
- 内存日志的生成有防振荡机制，当动态内存超过阈值（memory_log_config参数第1部分设置）时，生成内存日志时的动态内存会记为触发内存。此后，若动态内存若持续高于(触发内存-动态内存上限\*5%)，将不会再因超过阈值而生成内存日志，从而避免在阈值附近小幅振荡时反复生成日志。
- 按"内存波动百分比"条件（memory_log_config参数第2部分设置）触发生成内存上下文快照是基于3秒检测周期的，若在3秒检测周期内满足生成快照条件，不会生成内存上下文快照。
- 内存阈值触发、内存波动触发和周期性触发不会同时进行。
- 仅支持对名为{模块名}_{数字}格式的内存上下文按模块名合并，不符合此特点的不会合并，例如"pooler_memory_context"、"pooler_core_context"、"pooler_agent_context"是3种不同的内存上下文，显示时不会合并。
 
#### 日志文件存储路径
数据库节点的内存日志目录在"$GAUSSLOG/mem_log"目录下。
#### 日志文件命名格式
数据库节点的内存日志的命名规则：mem_log-创建时间.log。
#### 日志内容说明
数据库进程的全局内存上下文、会话级内存上下文、线程级内存上下文的详细使用统计信息，包含占用内存top20的会话级和线程级以及对应的客户端类型和SQL语句等信息，如果存在运行的并行逻辑解码任务，日志中也会包含并行逻辑解码的内存使用信息。
每种类型的内存上下文、每个query的内存上下文按内存使用量对排序最多显示top n个（由memory_log_config参数的第4部分控制），query信息最多显示top n个（由memory_log_config参数的第5部分控制）。
表1日志参数 
| 字段名称                         | 字段含义                                                                                   |
|:---|:---|
| Max_dynamic_memory           | 数据库进程最大可使用的动态内存。                                                                         |
| Dynamic_used_memory           | 当前进程已使用的动态内存大小。                                                                       |
| Dynamic_peak_memory         | 当前进程动态内存使用的历史最大值。                                                                     |
| Dynamic_thread_cxt_used_memory  | 当前进程线程级内存上下文已使用内存大小。                                                                   |
| Dynamic_session_cxt_used_memory | 当前进程会话级内存上下文已使用内存大小，仅在启用线程池时显示。                                                        |
| Dynamic_used_shrctx           | 当前进程全局内存上下文占用的内存大小。                                                                     |
| Dynamic_peak_shrctx         | 当前进程全局内存上下文占用的历史最大值。                                                                    |
| Max_backend_memory            | HA端口连接的会话申请的最大内存大小。                                                                      |
| Backend_used_memory           | HA端口连接的会话正在占用的内存大小。                                                                     |
| other_used_memory           | 未在内存上下文上申请的其他内存占用大小。                                                                   |
| unit                          | 同级内存量的单位。                                                                              |
| Context Type                 | 内存上下文类型，有"Shared Memory Context"，"Thread Memory Context"，"Session Memory Context"三种类型。 |
| context                      | 内存上下文的名称。同名、同模块名（格式为{模块名}_{数字}）的内存上下文会合并显示，名称只显示模块名。                                    |
| freeSize                     | 内存上下文上缓存的空闲内存的大小。                                                                      |
| totalSize                     | 内存上下文申请的总的内存大小。                                                                        |
| file                         | 内存申请所在的代码的文件名，该参数仅在memory_trace_level=level2时记录。                                        |
| line                          | 内存申请所在的代码的文件行号，该参数仅在memory_trace_level=level2时记录。                                      |
| size                         | 某一文件某一行号处申请的内存的累计大小，该参数仅在memory_trace_level=level2时记录。                                 |
| count                         | 合并统计的同名、同模块名内存上下文数量。                                                                   |
| query                          | 执行的语句。                                                                                |
| unique query id                 | 语句唯一ID。                                                                                  |
| debug query id                 | 语句调试ID。                                                                                  |
| session id                     | 会话ID。                                                                                     |
| thread id                      | 线程ID。                                                                                    |
| mem size                    | 语句申请内存大小。                                                                              |
| application name                | 应用名。                                                                                     |
   
#### 日志示例
- memory_trace_level=level1时记录日志如下所示：
  ```
  {
     "Global Memory Statistics":  {
     "Max_dynamic_memory":  34012,
     "Dynamic_used_memory":  3645,
     "Dynamic_peak_memory":  3664,
     "Dynamic_thread_cxt_used_memory":  383,
     "Dynamic_session_cxt_used_memory":  2582,
     "Dynamic_used_shrctx":  401,
     "Dynamic_peak_shrctx":  401,
     "Max_backend_memory":  648,
     "Backend_used_memory":  1,
     "other_used_memory":  0,
     "unit":  "MB"
   },
   "Memory Context Info":  {
     "Memory Context Detail":  {
       "Context Type":  "Shared Memory Context",
       "Memory Context":  {
         "context":  "IncreCheckPointContext",
         "freeSize":  2864,
         "totalSize":  263066352,
         "unit":  "Byte",
         "count":  1
       },
      ...
     },
     "Memory Context Detail":  {
       "Context Type":  "Session Memory Context",
       "Memory Context":  {
         "context":  "CachedPlan",
         "freeSize":  68041368,
         "totalSize":  235937792,
         "unit":  "Byte",
         "count":  1
       },
       ...
     },
     "Memory Context Detail":  {
       "Context Type":  "Thread Memory Context",
       "Memory Context":  {
         "context":  "LocalSysCacheShareMemoryContext",
         "freeSize":  60431360,
         "totalSize":  644141760,
         "unit":  "Byte",
         "count":  1
       },
       ...
     }
   "Query Info":  {
     "Query Context":  {
         "query":  "select distinct a from t3 order by a;",
         "unique query id":  "2286703632",
         "debug query id":  "1407374883554034",
         "session id":  "2",
         "thread id":  "140188551411456",
         "mem size":  1,
         "unit":  "MB",
         "application name":  "gsql",
         "Memory Context Detail":  {
             "Context Type":  "Session Memory Context",
             "Memory Context":  {
             "context":  "SessionTopMemoryContext",
             "freeSize":  97048,
             "totalSize":  460520,
             "unit":  "Byte",
             "count":  1
         },
         ...
       },
     "Query Context":  {
          "query":  "WLM fetch collect info from data nodes",
          "unique query id":  "0",
          "debug query id":  "0",
          "session id":  "140186948200192",
          "thread id":  "140186948200192",
          "mem size":  1,
          "unit":  "MB",
          "application name":  "workload",
          "Memory Context Detail":  {
              "Context Type":  "Thread Memory Context",
              "Memory Context":  {
              "context":  "LocalSysCacheShareMemoryContext",
              "freeSize":  150720,
              "totalSize":  1872096,
              "unit":  "Byte",
              "count":  1
          },
          ...
       },
      ...
    }，
   "parallel logical decode Info":  [{
     "slot name":  "slot1",
     "memory info":  "memory usage: reader toast memory size: 0, sender out buf memory size: 0, [xid, first_lsn, memory, entry num] : NULL"
    }]
  }
  ```
  
- memory_trace_level=level2时记录日志如下所示：
  ```
  {
     "Global Memory Statistics":  {
     "Max_dynamic_memory":  34012,
     "Dynamic_used_memory":  3645,
     "Dynamic_peak_memory":  3664,
     "Dynamic_thread_cxt_used_memory":  383,
     "Dynamic_session_cxt_used_memory":  2582,
     "Dynamic_used_shrctx":  401,
     "Dynamic_peak_shrctx":  401,
     "Max_backend_memory":  648,
     "Backend_used_memory":  1,
     "other_used_memory":  0,
     "unit":  "MB"
   },
   "Memory Context Info":  {
     "Memory Context Detail":  {
       "Context Type":  "Shared Memory Context",
       "Memory Context":  {
         "context":  "IncreCheckPointContext",
         "freeSize":  2864,
         "totalSize":  263066352,
         "unit":  "Byte",
         "count":  1,
         "MemoryDetail":  {
              "file":"xxx.cpp",
              "line":411,
              "size":211131,
          }
          ...
       },
      ...
     },
     "Memory Context Detail":        {
       "Context Type": "Session Memory Context",
       "Memory Context":       {
         "context":      "CachedPlan",
         "freeSize":     68041368,
         "totalSize":    235937792,
         "unit":"Byte",
         "count":1,
         "MemoryDetail":  {
              "file":"xxx.cpp",
              "line":411,
              "size":211131,
          }
          ...
       },
       ...
     },
     "Memory Context Detail":  {
       "Context Type":  "Thread Memory Context",
       "Memory Context":  {
         "context":  "LocalSysCacheShareMemoryContext",
         "freeSize":  60431360,
         "totalSize":  644141760,
         "unit":  "Byte",
         "count":  1,
         "MemoryDetail":  {
              "file":"xxx.cpp",
              "line":411,
              "size":211131,
          }
          ...
       },
       ...
     }
   "Query Info":  {
     "Query Context":  {
         "query":"select distinct a from t3 order by a;",
         "unique query id":  "2286703632",
         "debug query id":  "1407374883554034",
         "session id":  "2",
         "thread id":  "140188551411456",
         "mem size":  1,
         "unit":  "MB",
         "application name":  "gsql",
         "Memory Context Detail":  {
             "Context Type":  "Session Memory Context",
             "Memory Context":  {
             "context":  "SessionTopMemoryContext",
             "freeSize":  97048,
             "totalSize":  460520,
             "unit":  "Byte",
             "count":  1,
             "MemoryDetail":  {
                 "file":  "xxx.cpp",
                 "line":  461,
                 "size":  62976
             },
             ...
         },
         ...
       },
     "Query Context":  {
          "query":  "WLM fetch collect info from data nodes",
          "unique query id":  "0",
          "debug query id":  "0",
          "session id":  "140186948200192",
          "thread id":  "140186948200192",
          "mem size":  1,
          "unit":  "MB",
          "application name":  "workload",
          "Memory Context Detail":  {
              "Context Type":  "Thread Memory Context",
              "Memory Context":  {
              "context":  "LocalSysCacheShareMemoryContext",
              "freeSize":  150720,
              "totalSize":  1872096,
              "unit":  "Byte",
              "count":  1,
              "MemoryDetail":  {
                  "file":"xxx.cpp",
                  "line":352,
                  "size":40153344
              },
              ...
          },
          ...
       },
      ...
    }，
   "parallel logical decode Info":  [{
     "slot name":  "slot1",
     "memory info":  "memory usage: reader toast memory size: 0, sender out buf memory size: 0, [xid, first_lsn, memory, entry num] : NULL"
    }]
  }
  ```
  
 
#### 图形化内存信息html
生成JSON格式的.log文件的同时，还会在同一目录生成名称相同的html文件的.gz压缩包。将压缩包解压、把html文件和同目录下的echarts.min.js文件导出至同一目录下，并使用浏览器打开html文件，可查看图形化的内存信息。
内存信息与JSON格式的内存日志对应，由以下几个部分组成：
- Global Memory Statistics：显示各类别动态内存占最大动态内存的占比圆环图。
- Shared Memory Context：显示共享内存上下文的内存柱状图。若GUC参数memory_log_config第4部分设置为0则不会显示。
- Session Memory Context：显示会话内存上下文的内存柱状图。若GUC参数memory_log_config第4部分设置为0，或GUC参数enable_thread_pool=off，则不会显示。
- Thread Memory Context：显示线程内存上下文的内存柱状图。若GUC参数memory_log_config第4部分设置为0则不会显示。
- SQL Details：显示执行语句或线程的内存信息。若GUC参数memory_log_config第5部分设置为0则不会显示。当有内存上下文显示时，可通过单击每条语句条目来显示其top n内存上下文的内存柱状图。
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
GUC参数memory_trace_level设置为level2时相比于level1，会多显示内存上下文申请内存的位置和大小信息，可通过单击每种内存上下文的柱状图来显示其申请内存的位置和大小。
各部分所展示信息的字段含义如下表所示。
表2展示信息 
| 字段名称                           | 字段含义                                                                                      |
|:---|:---|
| Dynamic used share ctx memory  | 当前进程已使用的动态内存大小。                                                                         |
| Dynamic thread cxt used memory | 当前进程线程级内存上下文已使用内存大小。                                                                    |
| Dynamic session cxt used memory | 当前进程会话级内存上下文已使用内存大小，仅在开启线程池时显示。                                                          |
| Dynamic unused memory          | 当前进程未使用内存。                                                                              |
| Context Type                    | 内存上下文类型，有"Shared Memory Context"，"Thread Memory Context"，"Session Memory Context"三种类型。 |
| context                         | 内存上下文的名称。同名、同模块名（格式为{模块名}_{数字}）的内存上下文会合并显示，名称只显示模块名。                                    |
| totalSize                       | 内存上下文申请的总的内存大小。                                                                          |
| file                           | 内存申请所在的代码的文件名，该参数仅在memory_trace_level=level2时记录。                                        |
| line                            | 内存申请所在的代码的文件行号，该参数仅在memory_trace_level=level2时记录。                                        |
| size                           | 某一文件某一行号处申请的内存的累计大小，该参数仅在memory_trace_level=level2时记录。                                  |
| query                        | 执行的语句。                                                                                  |
| unique query id               | 语句唯一ID。                                                                                 |
| debug query id                  | 语句调试ID。                                                                                |
| session id                      | 会话ID。                                                                                   |
| thread id                      | 线程ID。                                                                                    |
| mem size                        | 语句申请内存大小。                                                                               |
| application name               | 应用名。                                                                                    |
   
