探索BI系统搭建的必要性与AI技术的应用潜力
963
2022-05-29
1.简介
GaussDB的动态内存使用方法是基于Postgres提供的内存上下文管理。在此基础上,GaussDB引入逻辑内存管理机制,控制进程内存使用,避免出现系统OOM问题,同时提供多项视图来追踪内存的使用情况。引入jemalloc开源库,替换glibc中的内存分配和释放,减少内存碎片,提升多线程内存分配的性能。
2.GaussDB的内存布局
GaussDB在原生的PG内存上下文机制上引入了第三方开源库jemalloc,jemalloc通过接管malloc的内存申请,提升了内存申请的效率。可以看到GaussDB的内粗你可以分为5大块,共享内存通过mmap等方式直接申请OS内存,memcontext、列存、通信库申请的内存都是通过原生PG的内存上下文管理机制申请内存,在此基础上引入了逻辑内存管理,统计了这些动态内存的大小,监控内存的使用,组后一部分则是直接通过malloc等申请的内存,对这部分内存计入others内存使用。
3.memcontext布局
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,这个视图统计了当前实例节点各个模块的内存使用情况:
视图 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,若过大,则说明存在第三方组件的内存分配出现泄漏
数据仓库服务 GaussDB(DWS)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。