GaussDB(DWS)内存管理技术简介

举报
fighttingman 发表于 2021/03/26 16:54:16 2021/03/26
【摘要】 1.简介GaussDB的动态内存使用方法是基于Postgres提供的内存上下文管理。在此基础上,GaussDB引入逻辑内存管理机制,控制进程内存使用,避免出现系统OOM问题,同时提供多项视图来追踪内存的使用情况。引入jemalloc开源库,替换glibc中的内存分配和释放,减少内存碎片,提升多线程内存分配的性能。 2.GaussDB的内存布局GaussDB在原生的PG内存上下文机制上引入了...

1.简介

GaussDB的动态内存使用方法是基于Postgres提供的内存上下文管理。在此基础上,GaussDB引入逻辑内存管理机制,控制进程内存使用,避免出现系统OOM问题,同时提供多项视图来追踪内存的使用情况。引入jemalloc开源库,替换glibc中的内存分配和释放,减少内存碎片,提升多线程内存分配的性能。

2.GaussDB的内存布局

image.png

GaussDB在原生的PG内存上下文机制上引入了第三方开源库jemalloc,jemalloc通过接管malloc的内存申请,提升了内存申请的效率。可以看到GaussDB的内粗你可以分为5大块,共享内存通过mmap等方式直接申请OS内存,memcontext、列存、通信库申请的内存都是通过原生PG的内存上下文管理机制申请内存,在此基础上引入了逻辑内存管理,统计了这些动态内存的大小,监控内存的使用,组后一部分则是直接通过malloc等申请的内存,对这部分内存计入others内存使用。

3.memcontext布局

image.png
GaussDB是基于原生的PG内存上下文来进行内存管理,与之前直接申请系统内存相比,这种内存上下文的好处是可以减少内存泄漏,通过这种方式可以记录内存的使用情况,可以很轻松的释放内存上下文的所有内容。在实际的使用过程中,每一个进程都有一个属于自己的内存上下文,每一个内存上下文都是一个节点,各个节点之间组织成树的结构,每一个根节点都有自己的孩子节点,当释放父节点的时候对应的孩子节点也会释放,这样就可以避免内存泄漏了。

4.内存管理视图

GaussDB通过GUC参数disable_memory_protect参数是否开启逻辑内存管理,默认是打开的。逻辑内存管理通过引入几个视图监控内存的使用情况,增加内存问题定位手段,常用的视图包括

  • Select * from pv_total_memory_detail; 观察总的内存 
  • Select * from pv_session_memory_detail order by totalsize desc; 查询哪个内存上下文比较高
  • Select * from pg_shared_memory_detail; 共享内存上下文占用
  • Select * from pg_stat_activity; 查看当前活跃的作业
    其中比较重要的视图是pv_total_memory_detail,这个视图统计了当前实例节点各个模块的内存使用情况:
    image.png
    视图 pv_total_memory_detail查询数据库进程内存使用,便于分析内存失败后问题;各字段含义如下;
  • max_process_memory: 实例可用最大内存,GUC参数max_process_memory相同;OM会自动计算给出
  • process_used_memory: 实例正在使用的物理内存;操作系统命令top中的RES数值相同
  • max_dynamic_memory: 实例可以动态申请的最大内存大小,由 max_process_memory – max_shared_memory – max_cstore_memory计算获得
  • dynamic_used_memory: 逻辑内存记账中,所有内存分配的当前数值,包括所有内存上下文和通信库动态分配的内存;达到 max_dynamic_memory数值时,报错:memory is temporarily unavailable
  • dynamic_peak_memory: 逻辑内存机制的最大数值,从节点启动至今
  • dynamic_used_shrctx: 逻辑内存记账中,仅共享内存上下文内存分配的当前数值;属于dynamic_used_memory的一部分
  • dynamic_peak_shrctx: 逻辑内存记账中,共享内存上下内存分配的最大数值
  • max_shared_memory: 实例中共享内存预占内存的大小,包含shared_buffers,比该数值大(还有其他数据结构也是共享内存)
  • shared_used_memory:实例中共享内存正在使用的大小,操作系统top的SHR数值;行存情况下,该数值较大
  • max_cstore_memory/ cstore_used_memory : 实例中列存储预占/正在使用的内存,用于数据缓存,GUC参数cstore_buffers相同
  • cstore_used_memory : 实例中列存储正在使用的内存,内部统计获得
  • max_sctpcomm_memory: 通信库允许使用的内存大小,由GUC参数comm_usable_memory设置
  • sctp_used_memory: 通信库正在使用的内存统计
  • sctp_peak_memory: 通信库最大使用的内存
  • other_used_memory:不在统计之内的内存,由 process_used_memory – dynamic_used_memory – shared_used_memory – cstore_used_memory获得;通常不超过2G,若过大,则说明存在第三方组件的内存分配出现泄漏
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。