【PostgreSQL的“double buffers“刷脏机制和参数】

news2025/1/15 7:51:27

PostgreSQL数据库使用双缓存写数据,shared_buffer + OS page cache,下图是PG与OS内存交互的过程 ,在PostgreSQL中,shared_buffers所代表的内存区域可以看成是一个以8KB的block为单位的数组,即最小的分配单位是8KB。这正好是一个page的大小,每个page以page内部的元数据(Page Header)互相区分。这样,当Postgres想要从disk获取数据(page)时,他会(根据page的元数据)先搜索shared_buffers,确认该page是否在shared_buffers中,如果存在,则直接命中,返回缓存的数据以避免I/O。如果不存在,再到OS缓存查找,最后才会通过I/O访问disk获取数据。

对于double buffer也可参考我这篇文章
PostgreSQL的shared_buffers和系统OS cache的关系 - 墨天轮

本篇文章,结合“double buffers”机制分析一下影响buffers刷脏页的相关机制和参数。

一、刷脏页之前记录WAL日志文件(redo)

一个PostgreSQL后端进程产生数据写入后,一定会先写入WAL日志。

而WAL日志也不是凭空产生的,它是将wal buffer里的数据持久化到磁盘的,大致的流程基本如下

通过一些接口注册wal数据
          ⬇
将注册的wal数据重组为一个数据链表
          ⬇
将数据链表中的数据拷贝到wal页buffer中
          ⬇
将wal页buffer刷写到磁盘中 

而对于这套流程里将记录存储到wal日志文件的主要函数 ,主要有以下几个:

XLogBeginInsert(); 
XLogRegisterData(); 
XLogRegisterBuffer(); 
XLogRegisterBufData();
XLogSetRecordFlags();  
XLogInsert();  
XLogRecordAssemble();  
XLogInsertRecord(); 
PageSetLSN   

在写完了wal日志后,数据库可以进行刷脏页。

二、数据库层刷脏

PostgreSQL支持一种称为全页写(full page write)的功能来处理部分写(页裂)问题。如果启用(默认启用),PG会在每个检查点之后、每个页面第一次发生变更时,将头数据和整个页面作为一条XLOG记录写入WAL缓冲区,然后再进行刷脏。

1.数据库刷脏页方式

1.bgwriter刷脏:后台刷不影响用户使用,但从全局上看可能会有单页多次重复刷的现象

2.checkpoint刷脏:阻塞性刷脏,严重影响QPS,但从全局上看可以等单页写多次,减少刷脏页的次数 。

checkpoint是以特定的时间间隔刷新所有脏页,并创建一个用于数据库恢复用的检查点 。而Bgwriter定期把脏数据从内存缓冲区刷出到磁盘中,减少查询时的阻塞 ,因为PostgreSQL在定期作检查点时需要把所有脏页写出到磁盘,通过BgWriter预先写出一些脏页,可以减少设置checkpoint时要进行的IO操作,以便始终有足够多的干净页面可以使用,使系统的IO负载趋向平稳 。两者的目的和执行频率都有不同。

Bgwriter使用的缓存替换算法在8.1版本之前是用的LRU,从8.1版开始,PostgreSQL使用了Clock Sweep(时钟扫描)。 clock sweep 算法的思想是根据访问次数来判断哪些数据为热点数据。当缓存空间不足,它会优先替换掉访问次数低的缓存 ,即缓存使用频率高的会被保存,低的被移除。

2.相关参数或机制

1.bgwriter相关

bgwriter_delay :bgwriter每次工作之后休息的间隔,休息避免阻塞用户线程。 在每一轮循环中,background writer都会为一定数量的脏缓冲区发出写操作,然后background writer进行睡眠,睡眠的时间为bgwriter_delay参数值,然后再唤醒,然后重复。设置bgwriter_delay为不是10的倍数的值可能与将其设置为10的下一个更高的倍数具有相同的结果。

bgwriter_flush_after :让bgwriter时不时的触发OS写dirty page 。当 background writer 写入的数据量超过本参数值之后,强制OS做一次FLUSH 。这么做会限制 kernel 中 page cache 的 dirty data 的数量,减少在 checkpoint 最后 fsync 时发生卡顿的可能性。 因为OS层可能要累积到一个较大值才会去写盘 此时可能导致较大的写盘IO动作, 从而争抢用户的IO 。但是bgwriter过于频繁让OS写磁盘也会有问题,例如shared buffer中的page在os层刷脏期间多次被标记为脏块,或者相邻的page在一个刷脏窗口内变脏并且被bgwriter多次写出,bgwrite频繁触发fsync ,也会增加磁盘的IO。

OS也有自己的IO调度策略,可以设置dirty_background_bytes为一个较小值, 避免大的IO。

bgwriter_lru_maxpages :一个bgwriter工作周期内, 最多刷出多少个dirty page。每轮 bgwriter 进程写入 LRU Page 的最大数量。本参数设置为零会禁用 background writing (bgwriter)行为,但是 background writer 进程依然会存在

bgwriter_lru_multiplier :一个bgwriter工作周期内, 应该刷出多少个dirty page。 在每轮中写出的脏缓冲区的数量基于最近几轮中服务器进程需要的新缓冲区的数量。最近的平均需求乘以bgwriter_lru_multiplier,以估计下一轮所需的缓冲区数量。脏缓冲区被写出,直到相应的数量的缓冲区为止。(每轮写入的缓冲区数量不会超过bgwriter_lru_maxpages。)。1.0的设置表示一个“及时”的策略,即准确地写入预测需要的缓冲区数量。较大的值可以缓冲需求的峰值,而较小的值有意让服务器进程完成写操作。默认值是2.0。

2.checkpoint相关

Checkpoint的工作内容:

1.Flush Dirty Pages,刷脏
2.Update some points,更新XlogCtl和ControlFile,并持久化至pg_control文件
3.Remove old wal,计算两次checkpoint间的WAL数量进行回收重用,并清理不再需要的WAL

如下为一些定义的Checkpoint触发的条件,是xlog.h头文件里定义的场景,会直接引起CreateCheckPoint和相关附属行为 ,有的包含了刷脏的流程。

需要注意的是,当非停库、redo完成、强制触发checkpoint时,如果数据库没有写入操作,则直接return不进行Flush dirtypage等操作 。也就是所谓的Checkpoint skipped机制。

三、系统层刷脏

OS缓存使用简单的LRU(移除最近最久未使用的缓存)

对于系统层的刷脏而言。对于这几个系统参数也有一个大致的分类。

1.后台异步

vm.dirty_background_bytes = 0  # 触发回刷的脏数据量。类似postgresql的bgwriter, 由后台进程而不是用户进程刷
vm.dirty_background_ratio = 5   触发回刷的脏数据占可用内存的百分比,5表示5%

2.前台阻塞刷脏

vm.dirty_bytes = 0 # 触发同步写的脏数据量。类似postgresql 的 server process刷脏, 用户进程参与, 所以会导致用户进程的RT升高
vm.dirty_ratio = 10  #触发同步写的脏数据占可用内存的百分比。是可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。
vm.dirty_writeback_centisecs = 500 # 回刷进程定时唤醒时间。后台进程的调度间隔。指定多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。
vm.dirty_expire_centisecs = 100 # 指定脏数据超时回刷时间(单位:1/100s),也就是脏数据能存活的时间。在page cache中存活时间超过这个值的脏页才会被刷盘。当 pdflush/flush/kdmflush 在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。
  • XXX_ratio和 XXX_bytes是同一个配置属性的不同计算方法。如果设置_bytes版本,则_ratio版本将变为0,反之亦然。,优先级 XXX_bytes > XXX_ratio

四、如何确认缓存数据量和缓存大小

在访问数据时,数据会先加载到os缓存,然后再加载到shared_buffers,这个加载过程可能是一些查询,也可以使用pg_prewarm预热缓存,以获取一个好的查询效果。

如下两种方式可以查看缓存的占用

1.pg_buffercache和pgfincore

可以使用pg_buffercache和pgfincore这两个插件去查看缓存的数据量。可参考我这篇文章里的相关使用
PostgreSQL的shared_buffers和系统OS cache的关系 - 墨天轮

2.hcache

除此之外可以使用hcache,hcache是一款查看buff/cache的工具,可以查看进程的缓存占用情况,以及占用操作系统缓存最多的N的文件 。

安装 方式如下

wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache 
chmod +x hcache
mv hcache /usr/local/sbin/ 

使用方式

  • 查看使用缓存最多的10个文件 ( hcache -top 10)
  • 查看列出的文件详细( lsof filename)
  • 查看进程的缓存使用 (hcache -pid xxxx)

五、如何释放shared_buffers和OS caches

注意:在生产环境释放缓存可能造成很大的影响。严禁随便执行。可供测试环境自己测试

1.如何释放shared_buffers

重启数据库可以释放shared_buffers。

2.如何释放OS cache

echo 1 > /proc/sys/vm/drop_caches

drop_caches的值可以是0-3之间的数字,代表不同的含义:

0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存

释放完内存后改回去让系统重新自动分配内存。

echo 0 >/proc/sys/vm/drop_caches

free -m #看内存是否已经释放掉了。
如果需要释放所有缓存,就输入下面的命令:

echo 3 > /proc/sys/vm/drop_caches

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/94133.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手慢无,阿里云神作被《Spring Boot进阶原理实战》成功扒下,限时

又来给大家分享好书了:郑天民老师的 《Spring Boot进阶:原理、实战与面试题分析》,别问网上有没有开源版本!问就是我也不知道,哈哈!但我会有 郑天民是谁? 资深架构师和技术专家,有近15年的软件…

中英文说明书丨艾美捷CD8α体内抗体相关研究方案

艾美捷CD8α体内抗体英文说明: CD8a (Ly 2.2) is present on the surface of most thymocytes and mature T-lymphocyte subsets including most T-suppressor/cytotoxic cells. CD8 participates in T cell activation by binding to T cell receptor complex and…

python csv数据集处理

目录 一:数据集准备 二:加载文件 三:查看DataFrame的头部和尾部数据 ,shape 四:统计摘要 五:获取数据 六:缺失值处理 一:数据集准备 可以新建txt,复制下面内容&…

登录处cookie验证逻辑漏洞——以熊海CMS为例

今天继续给大家介绍渗透测试相关知识,本文主要内容是登录处cookie验证逻辑漏洞。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未…

室内定位:物联网时代发展的必然需求

室内定位是指在室内环境中实现位置定位,主要采用无线通讯、基站定位、惯导定位等多种技术集成形成一套室内位置定位体系,从而实现人员、物体等在室内空间中的位置监控。 物联网时代,位置服务已成为人们工作生活必不可少的服务之一。蓝牙、5G、…

交换机和路由器

一台交换机有很多个端口,这些端口有各自的编号 计算机的网卡通过网线连接到交换机的网口上 在交换机中,有一张端口和MAC地址的映射表,称为MAC地址表,交换机维护这张表 交换机里的主机都是处在同一个子网里 不同子网之间是不能直…

一起Talk Android吧(第四百四十三回:UI控件之NumberPicker)

文章目录概念介绍使用方法内容总结各位看官们大家好,上一回中咱们说的例子是"UI控件之下拉列表:Spinner",这一回中说的例子是" UI控件之NumberPicker"。闲话休提,言归正转,让我们一起Talk Android吧!概念介绍…

Shiro框架入门

概述 官网介绍如下: Apache Shiro™ is a powerful and easy-to-use Java security framework that performs authentication, authorization, cryptography, and session management. With Shiro’s easy-to-understand API, you can quickly and easily secure a…

[C/C++/初学者]万年历(输入年份和月份,输出对应的日历表——数组)

//本代码不考虑历法问题,设定1年1月1日为星期一。 //以星期日为始。 //完整代码在最下方。 根据题意,我们首先需要接收年份的月份的数据。 printf("请输入年份:");scanf("%d",&Year);printf("请输入月份&#x…

Unity Addressables资源管理 资源组设置

Addressables资源管理总目录 1.Schema 翻译为:模式,计划。 目前理解为每个组的打包设置。 默认设置是只有两个Content Update Restriciton 和Content Packing& Loading 2.Content Update Restriction 内容更新方式 Can Change Post Release&…

Qt扫盲-QToolBox理论总结

QToolBox理论总结1. 简述2. 常用功能3. 信号&用途1. 简述 QToolBox 是一个类似前端的抽屉容器,它有一组选项卡,每个选项卡会在其下方自带有一个QWidget 来会显示一些内容。每个选项卡在选项卡列表中都有一个索引位置。这个选项卡的位置也是有顺序的…

Kerberos的概述和认证原理

什么是 Kerberos ​ Kerberos 是一种计算机网络认证协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。这个词又指麻省理工学院为这个协议开发的一套计算机软件。软件设计上采用客户端/服务器结构,并且能够进行相互认证&#xff…

国产三维gis软件的行业赋能情况

自二十世纪六十年代世上第一个GIS——加拿大地理信息系统(CGIS)面世至今,短短的40多年,GIS技术性从咿呀学语迈向了健康成长,在土地规划、电力工程、电信网、大城市管道网、水利工程、消防安全、交通出行及其城乡规划等…

Webug靶场搭建详解

今天继续给大家介绍渗透测试相关知识,本文主要内容是Webug靶场搭建详解。 免责声明: 本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负! 再次强调:严禁对未授权设…

C++ Reference: Standard C++ Library reference: Containers: map: map: find

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/find/ 公有成员函数 <map> std::map::find iterator find (const key_type& k); const_iterator find (const key_type& k) const;获取指向元素的iterator 在容器中搜索键值等于k的元素&…

助力软件供应链安全 蚂蚁集团多项产品入选信通院优秀案例

近日&#xff0c;由中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;主办&#xff0c;中国通信标准化协会云计算标准和开源推进委员会承办的3SCON软件供应链安全会议以线上直播形式召开。会上主办方发布了首期《软件供应链厂商和产品名录》&#xff0c;蚂蚁集…

mongoose 的打印改造

若要 mongoose.c 里的打印输出则需要在 main 函数里显式调用 mg_log_set(level)&#xff0c;参数是打印等级&#xff0c;如&#xff1a; mg_log_set(MG_LL_INFO);这样设置之后&#xff0c;程序执行起来就可以实现打印输出了&#xff0c;但这个输出着实让人看得不太明白&#x…

基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用

【详情链接】&#xff1a;基于Python多元线性回归、机器学习、深度学习在近红外光谱分析中的实践应用https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247527433&idx2&sn4a73e8451b57819dce1b660b55f7befa&chksmfe68aa63c91f2375d992e418ea6006ab8ea835e…

[附源码]Nodejs计算机毕业设计基于的企业人事管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

使用Springboot框架手撸一个安全、可靠的本地缓存工具

前言&#x1f353; 在实现本地缓存的时候&#xff0c;我们经常使用线程安全的ConcurrentHashMap来暂存数据&#xff0c;然后加上SpringBoot自带的Scheduled定时刷新缓存。虽然这样可以实现本地缓存&#xff0c;但既不优雅也不安全&#xff0c;一个好的本地缓存工具应该是这样搭…