前言

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

    <?php function demo01($a) { echo $a; } call_user_func("demo01", "hello world" ...

  2. session + cookie 实现登录功能

    前端部分代码实现 <div id="mainCp"> <div class="postForm"> <p> <labe ...

  3. 数据可视化之powerBI技巧(二十四)Power BI初学者刚见的错误,帮你轻松处理

    在学习PowerBI的过程中,尤其是刚接触的时候,不可避免的会遇到各种各样的错误,有时自己怎么检查都没法消除,不解决这个错误又没法进行下一步的工作,经常会搞的自己烦闷无比,不过最后通过自己的苦苦摸索. ...

  4. Mariadb之主从复制的读写分离

    首先我们来回顾下代理的概念,所谓代理就是指的是一端面向客户端,另外一端面向服务端,代理客户端访问服务端,我们把这种代理叫正向代理:代理服务端响应客户端我们叫做反向代理,这个我们在之前nginx系列博客 ...

  5. 静态代理,动态代理和CGLIB代理模式

    代理模式 一.概述 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象.如此便于在目标实现的基础上增加额外的功能操作,前拦截,后拦截等,以满足自身的业务需求,同时代理模式便于扩展目 ...

  6. 阿里面试官:这些软件测试面试题都答对了,I want you!

    [ 你悄悄来,请记得带走一丝云彩 ] 测试岗必知必会 01请描述如何划分缺陷与错误严重性和优先级别? 给软件缺陷与错误划分严重性和优先级的通用原则: 1. 表示软件缺陷所造成的危害和恶劣程度. 2. ...

  7. 通过代理模块拦截网页应用程序流量 - Intercept Web Application Traffic Using Proxy Modules

    测试网站: http://testphp.vulnweb.com/login.php 浏览器代理设置为:127.0.0.1:8080 查看拦截流量: 方式1:通Proxy - Intercept 方式 ...

  8. Java对象创建模式

    创建Java对象时,对于可为空的属性,创建对象的时候有3种模式:重叠构造器模式.JavaBeans模式.Builder模式(推荐).Stream模式(推荐).                     ...

  9. 我和ABP vNext 的故事

    Abp VNext是Abp的.NET Core 版本,但它不仅仅只是代码重写了.Abp团队在过去多年社区和商业版本的反馈上做了很多的改进.包括性能.底层的框架设计,它融合了更多优雅的设计实践.不管你是 ...

  10. 面试高频SpringMVC执行流程最优解(源码分析)

    文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! SpringMVC执行流程 SpringMVC概述 Spri ...