前言

在日常数据库的使用中,难免会遇到一些内存问题。此次博文主要向大家分享一些华为云数仓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. dotNetCore阅读源码-CreateDefaultBuilder及ConfigureWebHostDefaults内部

    版本:DotNetCore 3.1 CreateDefaultBuilder内部源码: public static IHostBuilder CreateDefaultBuilder(string[] ...

  2. 反射修改 static final 变量

    一.测试结论 static final 修饰的基本类型和String类型不能通过反射修改; 二.测试案例 @Test public void test01() throws Exception { s ...

  3. UiAutomator源码学习(2)-- UiAutomationBridge

    从上一章对UiDevice的学习,可以看出几乎所有的操作都离不开 UiAutomationBridge.重新看一下UIDevice的构造方法: private UiDevice(Instrumenta ...

  4. day78 作业

    目录 1 在作业.html的代码基础上,完成商品数量的加减,注意商品数量如果低于0个,则自动删除当前商品 2 在作业.html的代码基础仧,完成购物车总价格的计算 3 使用ajax获取北京天气,并把昨 ...

  5. MCU 51-4 独立按键&编码按键

    独立按键: 按键的按下与释放是通过机械触点的闭合与断开来实现的,因机械触点的弹性作用,在闭合与断开的瞬间均有一个抖动的过程,抖动必须清除. 按键按下一次,数码管数值加1: #include<re ...

  6. Maven 专题(九):后记

    尚硅谷视频链接:https://www.bilibili.com/video/av84877781/看视频的时候,根据自己的需要,访问量多的不一定是好的,适合自己的才是最好的,总的来说,尚硅谷的视频质 ...

  7. MYSQL 之 JDBC(十二): 处理Blob

    LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型 LOB分为两种内省:内部LOB和外部LOB 内部LOB将数据以字节流的形式存储在数据库的内部.因而内部L ...

  8. 数据可视化实例(十六):有序条形图(matplotlib,pandas)

    排序 (Ranking) 棒棒糖图 (Lollipop Chart) 棒棒糖图表以一种视觉上令人愉悦的方式提供与有序条形图类似的目的. https://datawhalechina.github.io ...

  9. python 装饰器(一):装饰器基础(一)装饰器形式,何时执行

    简介 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. 形式 假如有个名为 decorate 的装饰器: ...

  10. HDU - 1520 Anniversary party (树的最大独立集)

    Time limit :1000 ms :Memory limit :32768 kB: OS :Windows There is going to be a party to celebrate t ...