PostgreSQL(二十二)缓冲区管理器
目录
一、缓冲区概述
1、缓冲区结构
2、buffer_tag结构
3、Backend进程读取操作
4、写脏块
二、缓冲区管理器结构
1、第一层:Buffer Table layer(缓冲区表层)
2、第二层:Buffer Descriptor Layer(缓冲区描述层)
3、第三层:buffer pool layer
4、数据的访问过程
三、缓冲区管理器锁(Buffer Manager Locks)
1、表层的锁
2、描述层的锁
3、spin lock--自旋锁/旋转锁
四、缓冲区管理器的工作原理
1、情况1:访问已存放在缓冲区中的数据块
2、情况2:加载数据块到空的缓冲池插槽
3、情况3:加载数据块到一个需要释放的缓冲池插槽
4、缓冲区块替换机制
五、环形缓冲区(Ring Buffer)
1、Bulk-reading
2、Bulk-writing
3、Vacuum-processing
六、共享池缓冲区参数设置
2、wal_buffers 参数设置
3、effective_cache_size参数设置
一、缓冲区概述
1、缓冲区结构
缓冲区:存放各种类型的数据块
(1)数据文件页、表和索引块
(2)可用空间地图块(fsm)
(3)可见性地图块(_vm)
(4)缓冲区数组索引--buffer_ids
2、buffer_tag结构
(1)RelFileNode:分别为表对象oid、数据块oid、表空间oid
(2)页面的fork number(分别为0、1、2)(0=表和索引块,1=fsm,2=vm)
(3)页面number(页面属于哪个块)
示例:缓冲区标记:{(16821、16384、37721)、0、7}
(1)7=标识第7个块中的页
(2)0=fork号,0表明这是存放表数据的数据块
(3)37721=对象号(关系号,OID),表明是属于哪个对象的
(4)16384=数据库OID,说明该块的内容属于OID为16384的数据库
(5)16821=表空间OID,说明该块的内容属于OID 16821的表空间。
3、Backend进程读取操作
后台进程读取数据块到缓冲区的流程(图解)
4、写脏块
下面进程工作时会导致脏块写(将脏页刷新到存储区):
(1)checkpointer(检查点进程):
--将从上一个检查点以来到当前检查点为止,产生的脏块,全都写入磁盘。
--检査点进程将检査点记录写入WAL段文件,并在检查点启动时刷新脏页。
--ckpt的写是一个I/O密集型的写。
(2)background writer(后台写进程)
--后台写进程bgwr持续一点一点地刷新脏页,对数据库活动的影响最小。
--后台写进程的作用是可以减少检查点密集写的影响。
--后台写进程每200毫秒唤醒一次(由bgwriter_delay定义),最多刷新100页(由bgwriter_Iru_maxpages定义)(默认情况下)。
tip:类比oracle的bgwr和ckpt进程,不同的是:
在oracle中,ckpt会给bgwr一个写的信号,由bgwr完成全部的脏块写动作。
在PG中,检査点与后台写进程分离。pg的ckpt自己也会执行脏块写的动作,与bgwr一起写。
相比之下,PG后台写进程独立的方式可以减少ckpt在写时的I/O密集程度。
二、缓冲区管理器结构
Buffer manager’s three-layer structure--缓冲区管理器的三层结构(图解)1、第一层:Buffer Table layer(缓冲区表层)
在这一层内置的hash函数将buffer_tags映射到插槽,插槽中记录了buffer_tags和描述层的buffer_id的映射关系。
2、第二层:Buffer Descriptor Layer(缓冲区描述层)
本层描述内容包含:buffer_tag与缓冲池插槽id的映射关系,访问次数统计,锁等信息
(1)tag:数据块的tag
(2)buffer_id:缓冲池ID
(3)refcount:记录块被访问的次数。
(4)usage_count:使用的次数,与refcount相关。两者配合使用。
(5)countext_lock and io_in_progress_lock:锁信息。访问内存缓冲区时,需要进行加锁保护。
(6)flags:内存块的标记
--dirty bit:脏块
--valid bit:有效块(脏块的内容被写到磁盘后,原本的脏块就变为有效块)
--io_in_progress bit:正在写/处理的块
(7)freeNext
3、第三层:buffer pool layer
缓冲池是存储数据文件页(如表、索引)的简单数组。缓冲池数组的索引称为buffer_ids;
缓冲池被分割成大小为8k的插槽,等于页面大小。因此,每个槽可以存储整个页面。
4、数据的访问过程
第一次访问一个数据块(在缓冲区全为空时),缓冲区管理器是怎么做的:
(1)先请求一个缓冲区空间,再buffer table 层把描述层的buffer_id把buffer_tag进行映射;
(2)然后在描述层把buffer_tag与缓冲区id进行映射;
(3)最后把数据块读到相应的缓冲区槽。访问数据块时,要怎么做:
(1)先通过buffer table层,获取A块的插槽id=0
(2)通过ID=0定位到Buffer Descriptor层,找到对应的插槽,在插槽中获得对应的buffer_id
(3)将获取的buffer_id告诉后端进程,然后后端进程根据这个buffer_id来直接访问缓冲区
三、缓冲区管理器锁(Buffer Manager Locks)
缓冲区管理器为许多不同的目的使用许多锁;
锁是缓冲区管理器同步机制的一部分,它们与任何SQL语句和SQL选项都不相关。
1、表层的锁
BufMappingLock保护整个缓冲表的数据完整性。它是一个轻量锁,可以在共亨和独占模式下使用。
在缓冲区表中搜索条目时,后端进程保存共亨的BufMappingLock。当插入或删除条目时,后端进程持有独占锁。
2、描述层的锁
每个缓冲区描述符使用两个轻量级锁
(1)content_lock:内容锁。典型的强制访问限制的锁。它可以用于共享和独占模式。
当执行下列操作之一时,将获取独占内容锁:
--dml操作
--物理删除元组或压缩存储页上的可用空间(Vacuum操作和HOT处理)
--冻结存储页中的元组
(2)io_in_progress_lock:用于等待缓冲区上的I/O完成(对数据块进行操作时)。
当pg进程从存储区加载/写入页面数据时,该进程在访问存储器时持有相应描述符的独占io_in_progress锁。
3、spin lock--自旋锁/旋转锁
如何固定缓冲区描述符:
(1)获取缓冲区描述符的自旋锁
(2)将其refcount和usage_count的值增加1
(3)松开旋转锁
如何将脏位设置为“1”:
(1)获取缓冲区描述符的自旋锁
(2)使用按位操作将脏位设置为“1”
(3)松开旋转锁
四、缓冲区管理器的工作原理
1、情况1:访问已存放在缓冲区中的数据块
(1)后端进程访问表层相关插槽;
(2)获取共享模式的BufMapping锁;
(3)通过表层获得对应描述层的插槽ID(id=2);
(4)在描述层通过获得的插槽id,获取缓冲区的buffer id;
(5)释放锁;
(6)后端进程依据获得的buffer id,直接访问缓冲池的内容,获得数据。
2、情况2:加载数据块到空的缓冲池插槽
(1)后台进程没有在缓冲区中发现这个数据块;
(2)从描述层中分配一个可用的插槽,返回插槽id
(3)获取独家模式的BufMapping锁;
(4)在表层绑定tag与id信息;
(5)将磁盘中的数据块内容读取到缓冲池;
(6)释放锁;
(7)后台进程利用从描述层获取的buffer id,直接访问缓冲区内容。
3、情况3:加载数据块到一个需要释放的缓冲池插槽
核心:先释放、再加载
(1)后台进程发现目标数据不在缓冲池中。
(2)在描述层寻找可用的插槽,发现目前插槽已满。
然后根据替换机制规则,判断出F是一个可以老化出去的块。然后将这个块的空间释放,用于存储现在需要查询的数据块。
(3)目前这个内存块存储的还是原本Tag_F映射的buffer id对应的磁盘内容;
(4)获取旧的独家模式的BufMapping锁;
(5)获取新的独家模式的BufMapping锁,并在表层插入一条新的条目。此时在表层就会有两个记录的tag同时指向了同一个描述层id(接下来的步骤需要给旧的删除);
(6)删除旧条目,释放旧的独家模式的BufMapping锁(删除后,映射关系失效);
(7)将当前需要查询的数据,从磁盘中读取到缓冲区中;
(8)释放之前获取的新的独家模式的BufMapping锁;
(9)后台进程根据获取的buffer id直接访问缓冲区读取数据。
4、缓冲区块替换机制
替换页面算法
8.1以前:LRU算法
最近最少使用原则:热度高的表放到LRU的列表头部,热度低了就被放到列表末尾,老化放在末尾的表。
8.1及以后:时钟扫描算法
缓冲区描述符显示为蓝色或青色框,框中的数字显示每个描述符的使用计数,每扫描一次则-1,缓冲区每被访问过一次则+1
当时钟扫描到refcount=0时,此块将会被老化。否则重复循环扫描,直到扫到0为止
五、环形缓冲区(Ring Buffer)
当业务需要一个大块的缓冲池时,假如扫描了超过四分之一缓冲池空间(共享缓冲区/4)时,还没有找到足够的可用缓冲池,则会新分配一个环形缓冲区。这个新分配的环形缓冲池就被称为ring-buffer。
这种情况一般会出现在大数据块操作时,例如:bulk-reading(大量加载)、bulk-writing(大量写)、vacuum-processing(空间整理).
优点:不会因为某个特殊的大业务动作,来影响已经使用的数据缓冲区,起到一个保护作用,提高缓冲区重复利用率,降低磁盘I/O。
1、Bulk-reading
当大量加载业务需要大块的缓冲池切扫描了超过四分之一缓冲池还没找到,则会分配一个256KB的ring-buffer。
2、Bulk-writing
当大量写业务出现这种情况,会分配一个16MB的ring-buffer。
执行下面列出的sql命令时,会触发大量写业务:
(1)COPY FROM command.
(2)CREATE TABLE AS command.
(3)CREATE MATERIALIZED VIEW or REFERSH MATERIALIZED VIEW command.
(4)ALTER TABLE command.
3、Vacuum-processing
当自动真空机进行真空处理时出现这种情况,会分配一个256KB的ring-buffer。
六、共享池缓冲区参数设置
1、shared_buffers参数设置
show shared_buffers;
Alter system set shared_buffers=256M;
2、wal_buffers 参数设置
show wal_buffers;
Alter system set wal_buffers =4M
3、effective_cache_size参数设置
show effective_cache_size;
这个参数提供可用于磁盘高速缓存的内存量的估计值。它只是一个建议值,而不是确切分配的内存或缓存大小。它不会实际分配内存,而是会告知优化器内核中可用的缓存量。
这个值会影响执行SQL时是选择全表扫描还是优化器的决策。在一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描(全表扫描)更可能被使用。
在设置这个参数时,还应该考虑 Postgresql的共享缓冲区以及将被用于 Postgresql数据文件的内核磁盘缓冲区。
默认值是4GB。不建议修改,除非对于这个参数的理解以及数据库业务场景非常了解、笃定修改后会提高性能(大佬可以玩,菜鸡不要动)。相关文章:

PostgreSQL(二十二)缓冲区管理器
目录 一、缓冲区概述 1、缓冲区结构 2、buffer_tag结构 3、Backend进程读取操作 4、写脏块 二、缓冲区管理器结构 1、第一层:Buffer Table layer(缓冲区表层) 2、第二层:Buffer Descriptor Layer(缓冲区描述层…...

流程制造业与离散制造业有何差异?流程行业智能制造关注什么?
在当今快速发展的工业领域,智能制造已经成为推动制造业转型升级的关键力量。随着“工业4.0”概念的提出,智能制造的理念和技术被广泛应用于各个制造行业,包括离散制造业和流程制造业。尽管智能制造的起源和发展在很大程度上受到了离散制造业的…...

【论文速读】《面向深度学习的联合消息传递与自编码器》,无线AI的挑战和解决思路
这篇文章来自华为的渥太华无线先进系统能力中心和无线技术实验室,作者中有大名鼎鼎的童文。 一、自编码架构的全局收发机面临的主要问题 文章对我比较有启发的地方,是提到自编码架构的全局收发机面临的主要问题: 问题一:基于随…...

C++从入门到起飞之——输入输出!
目录 1.命名空间 1.1namespace的价值 1.2namespace的定义 1.3命名空间使⽤ 2.C输⼊&输出 3.完结散花 个人主页:秋风起,再归来~ C从入门到起飞 个人格言:悟已往之不谏,知来者犹可追 克心守己…...

米文AD10配置gmsl摄像头操作
一、进入桌面快捷方式 0、设置摄像头型号 miivii_websettings.desktop 设置摄像头 1、获取camera信息 cat /var/log/gmsl_camera.lognvidiamiivii-tegra:~$ cat /var/log/gmsl_camera.log attestationVerify [13] succeed. [INFO ]: miivii gmsl service start! [INFO ]: V…...

【Selenium配置】WebDriver安装浏览器驱动(ChromeEdge)
【Selenium配置】WebDriver安装浏览器驱动(Chrome&Edge) 文章目录 【Selenium配置】WebDriver安装浏览器驱动(Chrome&Edge)Chrome确认Chrome版本下载对应driver把解压后的chromedriver文件放在chrome安装目录下࿰…...
预测算法面试
这次面试的是一个预测算法的岗位。虽然我对供应链相关的预测很厌烦了,但是这个不是供应链领域的,感觉应该还好。 首先在介绍工作经历和项目部分,这次面试没有上来没有条理乱说一气,而是预测目标、算法架构、各种使用特征这些分层…...

号称世界上第一个开源实时翻译的 App,微软开源GraphRAG:极大增强大模型问答、摘要、推理,以及开源基于ChatGPT的超级文本代码智能体(附代码地址)
号称世界上第一个开源实时翻译的 App,微软开源GraphRAG:极大增强大模型问答、摘要、推理,以及开源基于ChatGPT的超级文本代码智能体(附代码地址) 在「端侧」上实现可离线的「实时同传」翻译,支持 29 语言的…...
PyTorch 2-深度学习-模块
PyTorch 2-深度学习-模块 一: pytorch1> pytorch 介绍2> pytorch 作用3> pytorch 优点4> pytorch 流程二:pytorch 模块1> torch.Tensor 模块2> torch.nn模块3> torch.nn.function模块4> torch.random模块5> torch.onnx模块6> torch.sparse模块7…...
【MyBatis】MyBatis 理论 40 问(二)
《MyBatis 理论 40 问》包含以下 2 篇文章: MyBatis 理论 40 问(一)MyBatis 理论 40 问(二) MyBatis 理论 40 问(二) 21.如何获取生成的主键?22.当实体类中的属性名和表中的字段名不…...

数据分析——Python网络爬虫(三){爬虫基本原理}
爬虫基本原理 爬虫基本流程拉取什么数据JavaScript渲染页面cookies爬虫代理检查robots.txt爬虫的攻与防 爬虫基本流程 • 获取网页源代码:通过库来实现,urllib,requests等实现http请求 • 提取信息:分析网页源代码࿰…...

Linux 忘记root密码,通过单用户模式修改
银河麒麟桌面操作系统 V10(sp1)”忘记用户密码,需要修改用户密码所写,可用于 X86 架构和 arm 架构。 2. 选择第一项,在上图界面按“e”键进行编辑修改。 3. 在以 linux 开头这行的行末,添加“init/bin/bas…...
安卓热门面试题二
什么是AndroidManifest.xml文件?它包含了哪些重要信息? AndroidManifest.xml文件是Android应用程序的全局配置文件,每个Android应用程序的根目录中都必须包含一个AndroidManifest.xml文件,且文件名不能修改。这个文件对于Android…...

agents 分类
一、分类 自动agent、半自动agent、领域、自定义sop和支持人为干预的agent。 先泼个冷水,目前这些agent项目都是实验品,发展还没有做知识库问答相关开源项目那么成熟, 二、全自动agent autoGPT、loopGPT、babyAGI 全自动agent就是人类不可…...
【期末考试复习】概率论与数理统计(知识点模式 - 复习题2)
题目: 设随机变量 X X X 的概率密度函数为 f ( x ) a b x f(x) a bx f(x)abx,其中 0 < x ≤ 1 0 < x \leq 1 0<x≤1; f ( x ) 0 f(x) 0 f(x)0,在其他情况下。已知 P ( X ≤ 1 / 2 ) 3 / 8 P(X \leq 1/2) 3/…...
Jetpack Compose实现一个简单的微信UI
https://blog.csdn.net/News53231323/article/details/128509048 https://franzliszt1847.blog.csdn.net/article/details/129344822...

myeclipse开发ssm框架项目图书管理系统 mysql数据库web计算机毕业设计项目
摘 要 随着计算机的广泛应用,其逐步成为现代化的标志。图书馆的信息量也会越来越大,因此需要对图书信息、借书信息、还书信息等进行管理,及时了解各个环节中信息的变更,要对因此而产生的单据进行及时的处理,为了提高高…...

网络安全防御 -- 防火墙安全策略用户认证综合实验
实验拓扑: 实验目的: 1、DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问。 2、生产区不允许访问互联网,办公区和游客区允许访问互联网。 3、办公区设备10.0.2.10不允许访问DM…...

捷配笔记-PCB阻焊颜色对产品有什么影响?
阻焊层也称为阻焊层或阻焊剂。它是一种薄的聚合物层,应用于(PCB)。阻焊层的目的是保护PCB表面,并有助于防止焊桥。焊桥是两个导体之间的无意连接,通常是由于存在一小块焊料。需要注意的是,阻焊层被视为其单…...

网信大数据信用报告查询怎么查?网信大数据有什么作用?
随着互联网的快速发展,大数据技术已经广泛应用于各行各业。其中,网信大数据信用报告查询成为了许多人关注的焦点。那么,如何查询网信大数据信用报告呢?网信大数据又有哪些作用呢?本文将为您一一解答。 一、如何查询网信大数据信用报告? 要…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践
在电商行业蓬勃发展的当下,多平台运营已成为众多商家的必然选择。然而,不同电商平台在商品数据接口方面存在差异,导致商家在跨平台运营时面临诸多挑战,如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...
Spring事务传播机制有哪些?
导语: Spring事务传播机制是后端面试中的必考知识点,特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发,全面剖析Spring事务传播机制,帮助你答得有…...

使用VMware克隆功能快速搭建集群
自己搭建的虚拟机,后续不管是学习java还是大数据,都需要集群,java需要分布式的微服务,大数据Hadoop的计算集群,如果从头开始搭建虚拟机会比较费时费力,这里分享一下如何使用克隆功能快速搭建一个集群 先把…...

Yolo11改进策略:Block改进|FCM,特征互补映射模块|AAAI 2025|即插即用
1 论文信息 FBRT-YOLO(Faster and Better for Real-Time Aerial Image Detection)是由北京理工大学团队提出的专用于航拍图像实时目标检测的创新框架,发表于AAAI 2025。论文针对航拍场景中小目标检测的核心难题展开研究,重点解决…...