❝开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共3300人左右 1 + 2 + 3 + 4 +5 + 6 + 7 + 8 +9)(1 2 3 4 5 6 7群均已爆满,开8群近400 9群 200+,开10群PolarDB专业学习群100+)
上周三IF-Club直播了PostgreSQL的干货,当时公司在开会所以没有完整听到内容,不过好在拿到了当时直播的PPT,这里对这个部分进行学习,这里和大家进行一个分享。
从上图中我们可以总结出以下内容
1 PostgreSQL 内存布局分为3个大的类型,这三个类型是
shared Memory , Priveate Memory , Dynamic Shared Memory,在我之前的PG学习中我其实是忽略了,DSM这个部分,这三个部分主要的功能。
Shared Memory(共享内存):所有后台/会话进程共享,用来放Buffer Pool、WAL 缓冲、锁表、ProcArray、元信息等。图中大的深绿矩形“Buffer Pools / Others”即此区域。
Private Memory(进程独享内存):每个 postgres 服务器进程自己的内存,采用 Memory Context 管理(例如 Portal/Executor/Parser 等上下文),在查询生命周期内分配释放,互不共享。
Dynamic Shared Memory(DSM,动态共享内存):位于图底部“Dynamic Shared Memory Areas”。主要服务并行查询/并行算子等需要在多个进程之间临时共享数据的场景,生命周期随任务结束而回收。
蓝色实线(postmaster → system/shared memory):实例启动时创建共享内存(现代 PG 通过 mmap/POSIX SHM,早期为 SysV)。
蓝色虚线(子进程 → shared/system memory):子进程 attach 已有共享内存,获得对共享结构的访问。
绿色实线:postmaster fork 各类后台/工作/会话进程。
黑色虚线双箭头:client 与 postmaster/backend 的连接请求与接受。
查询执行过程中(backend ↔ shared memory)会持续访问 Buffer Pool / WAL / 锁表 等共享结构,并在需要时与 DSM 协作(并行)
这里串一下,Postmaster负责建立整体内存的架构,shared memory是整体的公共内存使用区域,private memory 是客户访问数据的内存,DSM是在客户访问内存式开启多进程访问的时候的内存赋予。这套设计让 PG 在多进程模型下既能保证一致性,又能在并行与高并发场景中保持伸缩与稳定。
从这个图中我们可以看到两大块,一块是User space 主要负责Postgres 可以访问的地址范围,另一个部分kernel space是用户进程不能访问到的内存部分。
User space (128 TB)
地址范围:0x0000000000000000 ~ 0x00007FFFFFFFFFFF
每个进程私有,可通过 mmap、brk 等系统调用分配堆内存、栈、文件映射、共享内存等。
PostgreSQL 的 backend 进程(postgres 进程) 就在这个空间中运行,Kernel space (128 TB)
地址范围:0xFFFF800000000000 ~ 0xFFFFFFFFFFFFFFFF
保存内核代码(text)、数据、直接物理内存映射、vmalloc 区、I/O 映射、EFI、hypervisor、内核模块等。
这里我们关注的是 shared buffer pool resize 不进行重启,因为shared buffer pool 是在数据库启动时一次性的申请连续的共享内存区域,那么如果要动态的进行内存的后期分配,我们就需要将mmap固定大小的内存获取,改成预留一大片虚拟地址空间,在真正需要的内存的时候,在进行真正的物理内存的分配。
上图就是解释这部分如何进行动态内存分配 1 通过process virtual Memory address来设置虚拟机的地址空间,让每个数据库进程获取超大的连续的内存地址空间,然后在这个地址空间中,设置多个segment内存段,而这些段时可以单独扩展和单独卸载的,卸载就是相当于收缩了。
扩展也很方便,在虚拟地址空间中选择当前地址+偏移量的方式,扩展自己的虚拟空间,
下面着重讲一下此次我学到的内存动态扩展的部分。
从这张图可以看到内存扩展的部分,resize shared buffer 的主要机制在,图中的 Dynamic Region 和 Polar Memory manager 这里是让PolarDB for PG 可以动态扩展的核心,他提供了一块动态申请和释放的公共的共享区域,具体的扩展过程为 Postmaster 创建和管理 Dynamic Region ,当需要扩展内存时,Memory Manager将产生新的共享内存块,并将这个信息广播给现在正在工作的各个进程,各个进程通过信号机制,收到通知后,重新加载新的共享区域,扩展完成后,所有的被通知的进程都报告工作完成,从而保证整体的系统都不用重启而完成 shared buffer pool 的 resize.
在整体的数据库系统设计中,关键就是图中的dynamic region,这里为了优化不同进程内存地址不统一的问题,PolarDB for PG通过postmaster启动时御前申请1T的虚拟地址空间,让所有的子进程都继承这段地址,这样所有的内存段迎神到相同的地址后,所有的变了的地址就完全相同了,无需进行重建和解析,直接映射物理的地址。
而图中的memory manager这个在PG上没有的进程的核心在,管理内存的生命周期,包括何时建立和何时注销这些内存,这就让扩展异常的简单,如果需要扩展内存容量,就新建一批buffer内存块,并将这些块加入到空闲内存列表,然后数据库就可以像原来一样,直接从free_list中获取这些新加如的内存块,得到扩展的shared buffer。
缩容则相对扩容要麻烦,因为这里包含了正在使用的内存不能被释放的问题,同时还有强制进行数据刷盘的工作等等。
学到这里,基本上理解了PolarDB for PG的动态的内存resize 和 dump unused buffer block的问题。
置顶
超强外挂让MySQL再次兴盛,国内神秘组织拯救MySQL行动
邦邦硬的PostgreSQL技术干货来了,怎么动态扩展PG内存 !
微软动手了,联合OpenAI + Azure 云争夺AI服务市场
“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行
“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》
未知黑客通过SQL SERVER 窃取企业SAP核心数据,影响企业运营
那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师
非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星
说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意
这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!
OceanBase Hybrid search 能力测试,平换MySQL的好选择
HyBrid Search 实现价值落地,从真实企业的需求角度分析 !不只谈技术!
OceanBase 光速快递 OB Cloud “MySQL” 给我,Thanks a lot
从“小偷”开始,不会从“强盗”结束 -- IvorySQL 2025 PostgreSQL 生态大会
被骂后的文字--技术人不脱离思维困局,终局是个 “死” ? ! ......
个群2025上半年总结,OB、PolarDB, DBdoctor、爱可生、pigsty、osyun、工作岗位等
从MySQL不行了,到乙方DBA 给狗,狗都不干? 我干呀!
SQL SERVER 2025发布了, China幸亏有信创!
MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL
PostgreSQL 新版本就一定好--由培训现象让我做的实验
删除数据“八扇屏” 之 锦门英豪 --我去-BigData!
写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》
疯狂老DBA 和 年轻“网红” 程序员 --火星撞地球-- 谁也不是怂货
和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?
OceanBase 相关文章

最低0.47元/天 解锁文章
433

被折叠的 条评论
为什么被折叠?



