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表面,并有助于防止焊桥。焊桥是两个导体之间的无意连接,通常是由于存在一小块焊料。需要注意的是,阻焊层被视为其单…...
网信大数据信用报告查询怎么查?网信大数据有什么作用?
随着互联网的快速发展,大数据技术已经广泛应用于各行各业。其中,网信大数据信用报告查询成为了许多人关注的焦点。那么,如何查询网信大数据信用报告呢?网信大数据又有哪些作用呢?本文将为您一一解答。 一、如何查询网信大数据信用报告? 要…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
