“PostgreSQL“ 不重启机器就能调整 shared buffer pool 的原理

开头还是介绍一下群,如果感兴趣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,这里对这个部分进行学习,这里和大家进行一个分享。

王硕老师的PPT的图1
王硕老师的PPT的图1

从上图中我们可以总结出以下内容

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”。主要服务并行查询/并行算子等需要在多个进程之间临时共享数据的场景,生命周期随任务结束而回收。

PG内存学习
PG内存学习

蓝色实线(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 在多进程模型下既能保证一致性,又能在并行与高并发场景中保持伸缩与稳定。

Linux 地址分配从这个图中我们可以看到两大块,一块是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固定大小的内存获取,改成预留一大片虚拟地址空间,在真正需要的内存的时候,在进行真正的物理内存的分配。

动态分配shared buffer pool resize
动态分配shared buffer pool resize

上图就是解释这部分如何进行动态内存分配 1 通过process virtual Memory address来设置虚拟机的地址空间,让每个数据库进程获取超大的连续的内存地址空间,然后在这个地址空间中,设置多个segment内存段,而这些段时可以单独扩展和单独卸载的,卸载就是相当于收缩了。

扩展也很方便,在虚拟地址空间中选择当前地址+偏移量的方式,扩展自己的虚拟空间,

image
image

下面着重讲一下此次我学到的内存动态扩展的部分。

PolarDB for PG 动态扩展内存
PolarDB for PG 动态扩展内存

从这张图可以看到内存扩展的部分,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行动

AI 很聪明,但就怕脑子失忆,记忆对AI很重要

从某数据库信任“危机”,简谈危机公关

邦邦硬的PostgreSQL技术干货来了,怎么动态扩展PG内存 !

数据库信创话题能碰吗? 今天斗胆说说

企业出海数据库设计问题一角,与政策动荡下的全球数据库产品

计问题一角,与政策动荡下的全球数据库产品

《数据库江湖邪修门派:心法五式全解》

微软动手了,联合OpenAI + Azure 云争夺AI服务市场

“当复杂的SQL不再需要特别的优化”,邪修研究PolarDB for PG 列式索引加速复杂SQL运行

企业出海“DB”要合规,要不挣那点钱都不够赔的

“合体吧兄弟们!”——从浪浪山小妖怪看OceanBase国产芯片优化《OceanBase “重如尘埃”之歌》

未知黑客通过SQL SERVER 窃取企业SAP核心数据,影响企业运营

那个MySQL大事务比你稳定,主从延迟低,为什么? Look my eyes! 因为宋利兵宋老师

非“厂商广告”的PolarDB课程:用户共创的新式学习范本--7位同学获奖PolarDB学习之星

      说我PG Freezing Boom 讲的一般的那个同学,专帖给你,看看这次可满意

     短评 国产数据库营销市场 “问题”

     这个 PostgreSQL 让我有资本找老板要 鸡腿 鸭腿 !!

     DBA被瞧不起 你有什么建议? Drive Fast !

OceanBase Hybrid search 能力测试,平换MySQL的好选择

HyBrid Search 实现价值落地,从真实企业的需求角度分析 !不只谈技术!

一个IP地址访问两个PG实例,上演“一女嫁二夫”的戏码

OceanBase 光速快递 OB Cloud “MySQL” 给我,Thanks a lot

从“小偷”开始,不会从“强盗”结束 -- IvorySQL 2025 PostgreSQL 生态大会

被骂后的文字--技术人不脱离思维困局,终局是个 “死” ? ! ......

9

个群2025上半年总结,OB、PolarDB, DBdoctor、爱可生、pigsty、osyun、工作岗位等

卷呀卷,Hybrid 混合查询学习--哪个库是小趴菜

从MySQL不行了,到乙方DBA 给狗,狗都不干? 我干呀!

DBA 干不好容易蹲牢房--这事你知道吗?

SQL SERVER 2025发布了, China幸亏有信创!

MongoDB 麻烦专业点,不懂可以问,别这么用行吗 ! --TTL

P-MySQL SQL优化案例,反观MySQL不死没有天理

MySQL 条件下推与排序优化实例--MySQL8.035

云数据库厂商除了卷技术,下一个阶段还可以卷什么?

PostgreSQL 新版本就一定好--由培训现象让我做的实验

某数据库下的一手好棋!共享存储落子了!

删除数据“八扇屏” 之 锦门英豪  --我去-BigData!

PostgreSQL “乱弹” 从索引性能到开发优化

写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》

SQLSHIFT 是爱可生对OB的雪中送炭!

青春的记忆,MySQL 30年感谢有你,再见!(译)

老实人做的数据库产品,好像也不“老实” !

疯狂老DBA 和 年轻“网红” 程序员 --火星撞地球-- 谁也不是怂货  

哈呀站,OB广州开发者大会 之 “五” 眼联盟

和架构师沟通那种“一坨”的系统,推荐只能是OceanBase,Why ?

OceanBase 相关文章

某数据库下的一手好棋!共享存储落子了!

写了3750万字的我,在2000字的OB白皮书上了一课--记 《OceanBase 社区版在泛互场景的应用案例研究》

     哈呀站,OB广州开发者大会 之 “五” 眼联盟

OceanBase 单机版可以大批量快速部署吗? YES

### PostgreSQL 缓冲池实现与配置 #### 缓冲池概述 PostgreSQL 实现了一个高效的缓冲区管理器来优化磁盘 I/O 和内存使用效率。这个组件通常被称为共享缓存(Shared Buffer),它充当着数据库实例和操作系统之间的高速缓存层[^1]。 #### 共享缓存的工作原理 当客户端请求访问某个数据页面时,服务器会先检查该页面是否已经在共享缓存中存在。如果命中,则直接返回;如果没有找到,则从物理存储读取到内存中的适当位置并记录下来以便将来更快地检索。这种机制显著减少了频繁的磁盘操作次数,从而提高了整体性能。 #### 配置参数详解 为了更好地控制如何利用这些资源,PostgreSQL 提供了一系列重要的配置项: - **shared_buffers**: 设置用于缓存表和索引数据的最大内存量,默认通常是安装程序推荐的一个合理值。建议将其设置为系统总 RAM 的 25% 左右,具体取决于工作负载特性。 - **effective_cache_size**: 这是一个提示给查询规划器关于整个可用缓存大小的信息,包括文件系统的缓存和其他应用程序可能占用的部分。此参数影响成本估算模型的选择路径优先级,并实际分配额外内存。 - **bgwriter_lru_maxpages** 及其他后台写入者相关参数:用来调节异步清理脏页的速度以及频率,确保会因为过多未同步的数据而引发必要的 checkpoint 活动。 ```sql SHOW shared_buffers; SET shared_buffers TO '4GB'; ``` 通过上述 SQL 命令可以查看当前设置或将 `shared_buffers` 调整至指定数值。需要注意的是修改此类全局级别参数往往需要重启服务才能生效。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值