前言

在日常数据库的使用中,难免会遇到一些内存问题。此次博文主要向大家分享一些华为云数仓GaussDB(DWS)内存的基本框架以及基本视图的使用,以便遇到内存问题后可以有一个基本的判断。

注意,本篇博文基于华为云数仓GaussDB(DWS) 8.0版本,其他版本细节上或许稍有不同。

内存常用视图

1. PV_TOTAL_MEMORY_DETAIL视图

该视图会展示当前数据库节点的内存使用信息,单位为MB。

视图中个字段的含义:nodename:节点名称,memorytype:内存类型,memorymbytes:对应内存类型的大小。

常用的内存类型有以下几种:

  • max_process_memory:取自GUC参数max_process_memory的配置,表示一个数据库节点最大可使用的物理内存。
  • process_used_memory:取自/proc/pid/statm(第二个值) * pagesize,pid替换为当前节点所在的进程号。表示当前节点所处进程已使用的内存。
  • max_dynamic_memory:由下面公式计算而来,表示Gaussdb内核所能使用的最大内存。
  • max_dynamic_memory = max_process_memory- max_cstore_memory - udf_reserved_memory - max_shared_memory ;
  • dynamic_used_memory:GaussDB内核已使用内存,由GaussDB内存管理在申请内存时统计而来。
  • dynamic_peak_memory:GaussDB内核使用内存峰值,由GaussDB内存管理在申请内存时统计而来。
  • dynamic_used_shrctx:GaussDB内核已使用线程间共享内存上下文内存大小,由GaussDB内存管理在申请内存时统计而来。
  • dynamic_peak_shrctx:GaussDB内核已使用线程间共享内存上下文内存峰值,由GaussDB内存管理在申请内存时统计而来。
  • max_shared_memory:进程间最大共享内存大小
  • shared_used_memory:进程间已使用共享内存大小,由/proc/pid/statm(第三个值) * pagesize值统计而来。
  • max_cstore_memory:列存允许的最大使用内存,由GUC参数cstore_buffers配置。
  • cstore_used_memory:列存已使用内存,一般包含列存或HDFS使用过程中所消耗的内存。
  • other_used_memory:通常表示除去GaussDB内核使用的内存以外的内存使用,通常是三方库使用所消耗的内存,例如LLVM,Kerberos等。
postgres=# select * from  PV_TOTAL_MEMORY_DETAIL;
nodename | memorytype | memorymbytes
--------------+-------------------------+--------------
coordinator1 | max_process_memory |
coordinator1 | process_used_memory |
coordinator1 | max_dynamic_memory |
coordinator1 | dynamic_used_memory |
coordinator1 | dynamic_peak_memory |
coordinator1 | dynamic_used_shrctx |
coordinator1 | dynamic_peak_shrctx |
coordinator1 | max_shared_memory |
coordinator1 | shared_used_memory |
coordinator1 | max_cstore_memory |
coordinator1 | cstore_used_memory |
coordinator1 | max_sctpcomm_memory |
coordinator1 | sctpcomm_used_memory |
coordinator1 | sctpcomm_peak_memory |
coordinator1 | other_used_memory |
coordinator1 | gpu_max_dynamic_memory |
coordinator1 | gpu_dynamic_used_memory |
coordinator1 | gpu_dynamic_peak_memory |
coordinator1 | pooler_conn_memory |
coordinator1 | pooler_freeconn_memory |
coordinator1 | storage_compress_memory |
coordinator1 | udf_reserved_memory |
( rows)

2. PV_SESSION_MEMORY_DETAIL视图

华为云数仓GaussDB(DWS)的内存管理框架沿用了之前的内存上下文的思路。在PV_SESSION_MEMORY_DETAIL的视图中,将会统计各线程的内存上下文维度统计的内存使用情况。

视图中个字段的含义如下:

Sessid:表示Session ID,由线程启动时间+线程标识拼接而来。

Sesstype:线程名称

Contextname:内存上下文名称。

Level:内存上下文层级。

Parent:父内存上下文名称。

Totalsize:当前内存上下文内存大小

Freesize:当前内存上下文已释放内存大小

Usedsize:当前内存上下文已使用大小。

postgres=# select * from PV_SESSION_MEMORY_DETAIL order by totalsize desc;
sessid | sesstype | contextname | level | parent | totalsize | freesize | usedsize
----------------------------+-------------------------+------------------------------+-------+------------------------------+-----------+----------+----------
0.140169093357952 | postmaster | Postmaster | | TopMemoryContext | | |
0.140169093357952 | postmaster | gs_signal | | TopMemoryContext | | |
1594694378.140168361137920 | WLMCollectWorker | CacheMemoryContext | | TopMemoryContext | | |
1594694378.140168296134400 | WLMarbiter | CacheMemoryContext | | TopMemoryContext | | |
1594694378.140168465999616 | JobScheduler | CacheMemoryContext | | TopMemoryContext | | |
1594708276.140168270964480 | postgres | CacheMemoryContext | | TopMemoryContext | | |
1594694438.140168207001344 | postgres | CacheMemoryContext | | TopMemoryContext | | |
1594694378.140168344356608 | WLMmonitor | CacheMemoryContext | | TopMemoryContext | | |
1594708276.140168270964480 | postgres | TempSmallContextGroup | | | | |
1594694438.140168207001344 | postgres | TempSmallContextGroup | | | | |
1594708276.140168270964480 | postgres | SRF multi-call context | | FunctionScan_140168270964480 | | |

3. PG_SHARED_MEMORY_DETAIL视图

华为云数仓GaussDB(DWS)除了通用内存上下文以外,还包含共享内存上下文类型用于线程间共享数据。由于共享内存上下文是属于一个进程的,故该视图相比PV_SESSION_MEMORY_DETAIL,不存在sessid,其他的字段含义相同。

postgres=# select * from PG_SHARED_MEMORY_DETAIL order by totalsize desc;
contextname | level | parent | totalsize | freesize | usedsize
----------------------------------------+-------+----------------------------------------+-----------+----------+----------
Workload manager memory context | | ProcessMemory | | |
PoolerAgentContext | | PoolerMemoryContext | | |
PoolerCoreContext | | PoolerMemoryContext | | |
ProcessMemory | | | | |
wlm iostat info hash table | | Workload manager memory context | | |
WaitCountGlobalContext | | ProcessMemory | | |
wlm user info hash table | | Workload manager memory context | | |
OBS connector cache | | ProcessMemory | | |
Resource pool hash table | | Workload manager memory context | | |
Dummy server cache | | ProcessMemory | | |
Node Pool | | PoolerCoreContext | | |

内存相关数据收集

通过前面讲述的几个内存视图,我们可以对华为云数仓GaussDB(DWS)内存有一个整体的理解。下面将分享几个内存相关数据收集的功能。

注意: 鉴于论坛中的问题多是release版本,故debug版本的各种内存相关功能将不再此次介绍以免混淆。同时收集数据就会带来一些消耗,避免长期大规模的使用下面的方案,仅用作问题诊断数据分析使用。

1. pv_session_memctx_detail函数

通过上面的视图介绍我们了解到了PV_SESSION_MEMORY_DETAIL视图的作用。我们可以通过pv_session_memctx_detail打印出该线程内存上下文的详细信息。注意第一个参数表示线程ID,我们根据上线的介绍得知sessid的后半部分就是线程ID。第二个参数表示需要打印内存上下文的名称,在release为空才可以生效即由TopMemoryContext开始递归打印内存上下文信息。Release版本不包含chunk的详细信息。

例如:

select * from pv_session_memctx_detail(,'');

生成的文件默认在/tmp/dumpmem下,文件中三列分别表示内存上下文名称,总大小,剩余大小。

文件内容样例:

140168207001344_1594695418.log

TopMemoryContext, ,
Record information cache, ,
TableSpace cache, ,
set params hash table, ,
VecFuncHash, ,
MaskPasswordCtx, ,
RowDescriptionContext, ,
MessageContext, ,
Operator class cache, ,
smgr relation table, ,

2. memory_tracking_mode参数

除了上面的内存上下文数据统计,我们还可以通过memory_tracking_mode设置内存信息统计的模式,共支持四种模式:

none:不启动内存统计功能。

normal:仅做内存实时统计,不生成文件。

executor:生成统计文件,包含执行层使用过的所有已分配内存的上下文信息。当为executor模式时,将在GaussDB进程(取决于在哪个数据节点最终执行了该算子)的pg_log目录下生成cvs格式文件,命名方式为:memory_track_<DN名称>_query_<queryid>.csv。作业执行时,执行器postgres线程和所有stream线程执行的算子信息,都将输入该文件。其中各字段分别为:输出顺序号、线程内分配内存上下文的顺序号、当前内存上下文的名称、父内存上下文的输出顺序号、父内存上下文的名称、内存上下文树形层次级别号、当前内存上下文使用的内存峰值、当前内存上下文及其所有子内存上下文使用的内存峰值、当前线程所在query的plannodeid。

fullexec:生成文件包含执行层申请过的所有内存上下文信息。当设置为fullexec模式时,输出信息和executor模式相同,但可能增加部分内存上

下文分配信息,因为所有申请内存(无论是否申请成功)相关的信息都会被打印出来。由于仅记录内存申请信息,故记录中内存上下文使用的峰值均为0。

csv文件内容样例:

memory_track_datanode1_query_72339069014639220.csv

, , ExecutorState, , (null), , 8K, 656K,
, , CStoreScan_139944754403072, , ExecutorState, , 272K, 625K,
, , cstore scan per scan memory context, , CStoreScan_139944754403072, , 24K, 24K,
, , cstore scan memory context, , CStoreScan_139944754403072, , 328K, 328K,
, , VecToRow_139944754403072, , ExecutorState, , 23K, 23K,
, , ExecutorState, , (null), , 8K, 144K,
, , Stream_72339069014639220_4, , ExecutorState, , 72K, 72K,
, , Sort_72339069014639220_3, , ExecutorState, , 8K, 40K,
, , TupleSort, , Sort_72339069014639220_3, , 32K, 32K,
, , Agg_72339069014639220_2, , ExecutorState, , 24K, 24K,

一些诊断方案:

1. 内存膨胀

在release版本调试工具以及信息比较受限,基本都是先通过前面介绍的三种视图初步定位大致功能。首先查看PV_TOTAL_MEMORY_DETAIL视图确定是哪一块内存出现了膨胀或者泄露。若是other_used_memory则要考虑三方仓的场景。若是dynamic_used_memory较大,则要查PV_SESSION_MEMORY_DETAIL视图,查看哪个线程,哪个内存上下文占用内存过多。根据这些信息推断出大致问题场景。

2. 内存不足

在内核发现内存不足的时候会有memory is temporarily unavailable的日志提示。首先观察日志,若日志里是reaching the database memory limitation则说明内核使用内存到达了max_dynamic_memory,则需要根据PV_SESSION_MEMORY_DETAIL视图分析是那个内存上下文占用内存较多,分析出业务场景。若日志里是reaching the OS memory limitation,则表示是操作系统分配内存失败导致,需要看操作系统参数配置以及内存硬件等情况。

小结:

生产环境出现内存问题一般会比较棘手,而且release版本内存检测工具以及数据信息使用都比较受限,遇到问题需要通过上述的方案以及手段快速定位出出现内存问题的相关业务场景。有了业务场景,后面通过debug版本使用ASAN地址消毒技术以及Jemalloc Profiling便可以较快的定位出来。

点击关注,第一时间了解华为云新鲜技术~

华为云GaussDB(DWS)内存知识点,你知道吗?的更多相关文章

  1. 揭秘华为云GaussDB(for Influx):数据直方图

    摘要:本文带您了解直方图在不同产品中的实现,以及GaussDB(for Influx)中直方图的使用方法. 本文分享自华为云社区<华为云GaussDB(for Influx)揭秘第九期:最佳实践 ...

  2. 升级的华为云“GaussDB”还能战否?

    摘要:芯片.操作系统.数据库是现代信息技术领域的三大核心基础,做数据库,不仅需要技术和投入,对华为这种做通讯起家的企业,更需要的是一种并非玩票性质的态度. GaussDB,不仅蕴含着华为对数学和科学的 ...

  3. 揭秘华为云GaussDB(for Influx)最佳实践:hint查询

    摘要:GaussDB(for Influx)通过提供hint功能,在单时间线的查询场景下,性能有大幅度的提升,能有效满足客户某些特定场景的查询需求. 本文分享自华为云社区<华为云GaussDB( ...

  4. 华为云PB级数据库GaussDB(for Redis)揭秘第七期:高斯Redis与强一致

    摘要:在KV数据库领域,"强一致性"不仅是一个技术名词,它更是业务与运维的重要需求. 清明刚过,五一假期就要来了.大好春光,不如去婺源看油菜花吧!小云迅速打开APP刷出余票2张,赶 ...

  5. 不服跑个分:ARM鲲鹏云服务器实战评测——华为云鲲鹏KC1实例 vs. 阿里云G5实例【华为云技术分享】

    原文链接:https://m.ithome.com/html/444828.htm 今年一月份,华为正式发布了鲲鹏920数据中心高性能处理器,该处理器兼容ARM架构,采用7纳米制造,最高支持64核,主 ...

  6. [转帖]华为鲲鹏云服务器实战:华为云鲲鹏KC1实例 vs. 阿里云G5实例

    鲲鹏云服务器实战:华为云鲲鹏KC1实例 vs. 阿里云G5实例 https://m.ithome.com/html/444828.htm 2019-09-12 15:25IT之家 (阿迷) 今年一月份 ...

  7. 一文带你读懂!华为云在ACMUG技术沙龙上都透露了些啥?

    摘要:近日,华为云数据库业务总裁苏光牛在ACMUG中国MySQL用户组主办的 "华为云专场" 技术沙龙中分享了华为云数据库重磅新品GaussDB的核心能力与竞争优势.那么, Gau ...

  8. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历

    摘要:华为云数据库GaussDB(for Cassandra) 是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库:它依靠共享存储池实现了强一致,保证数据的安全可靠. 本文 ...

  9. 华为云PB级数据库GaussDB(for Redis)揭秘第八期:用高斯 Redis 进行计数

    摘要:高斯Redis,计数的最佳选择! 一.背景 当我们打开手机刷微博时,就要开始和各种各样的计数器打交道了.我们注册一个帐号后,微博就会给我们记录一组数据:关注数.粉丝数.动态数-:我们刷帖时,关注 ...

随机推荐

  1. day52作业

    做一个小米商城首页的头部 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  2. day02 java学习

    Java三大版本 Write once,Run anywhere. (基于JVM虚拟机) JavaSE 标准版 JavaME 嵌入式开发 JavaEE 企业级开发 Java三大名词 JDK Java开 ...

  3. Redis RDB 分析工具 rdbtools 说明

    背景 Redis是基于内存的KV数据库,内存作为存储介质,关注其内存的使用情况是一个重要指标,解析其内部的存储信息是给出优化方法和维护的最基本要求.解析内存有二种方法:第一个是通过scan遍历所有ke ...

  4. shell专题(二):Shell解析器

    (1)Linux提供的Shell解析器有: [atguigu@hadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/da ...

  5. Quartz.Net系列(十三):DateBuilder中的API详解

    1.DateOf.ToDayAt.TomorrowAt DateOf:指定年月日时分秒 public static DateTimeOffset DateOf(int hour, int minute ...

  6. Ethical Hacking - POST EXPLOITATION(1)

    METERPRETER BASICS >help - shows help >background - backgrounds current session >sessions - ...

  7. Ethical Hacking - GAINING ACCESS(5)

    Server Side Attack Install Metasploit cummunity/pro and active it. Create a new project for the targ ...

  8. finalize()和四种引用的一点思考

    一次对ThreadLocal的学习引发的思考 ThreadLocal对Entry的引用是弱引用,于是联想到四种引用的生命周期. 强引用,不会进行垃圾回收 软引用,JVM内存不够,进行回收 弱引用,下次 ...

  9. Python编程初学者指南|百度网盘免费下载|Python新手入门资料

    Python编程初学者指南|百度网盘免费下载 提取码:9ozx 目录  · · · · · · 第1章 启程:Game Over程序1.1 剖析Game Over程序1.2 Python简介1.2.1 ...

  10. 在java中进行日期时间比较的4种方法

    1. Date.compareTo() java.util.Date提供了在Java中比较两个日期的经典方法compareTo(). 如果两个日期相等,则返回值为0. 如果Date在date参数之后, ...