【PostgreSQL-14版本snapshot的几点优化】

news2024/12/27 11:04:09

最近在分析PostgreSQL-14版本性能提升的时候,关注到了Snapshots的这一部分。发现在PostgreSQL-14版本,连续合入了好几个和Snapshots相关的patch。

并且,Andres Freund也通过这些改进显著减少了已确定的快照可扩展性瓶颈,从而改进了Postgres处理大量连接的问题,因为在连接数很高时计算一个快照的代价是很昂贵的。(对于分析连接可扩展性的局限性可以参考Andres Freund的这篇文章 Analyzing the Limits of Connection Scalability in Postgres - Microsoft Community Hub)

本篇文章,我会结合Andres Freund的几个patch进行一些分析,看看在PostgreSQL-14版本里对于Snapshots做的这部分优化。

在PostgreSQL里是使用SnapshotData结构体的xip来记录哪些事务正在运行中,正常情况下,对于普通的MVCC快照,xip记录了所有运行中的事务ID。(除了快照是处于recovery状态产生的,这个时候它为空)

typedef struct SnapshotData
{
	TransactionId xmin;			/* all XID < xmin are visible to me */
	TransactionId xmax;			/* all XID >= xmax are invisible to me */
	TransactionId *xip;
	uint32		xcnt;			/* # of xact ids in xip[] */
	TransactionId *subxip;
        int32	    subxcnt;		/* # of xact ids in subxip[] */
...

在PostgreSQL-14版本之前,每个PG进程都对应一个PGPROC结构、一个PGXACT结构,而从PostgreSQL-14版本开始,把PGXACT合到PGPROC里面了。

一、优化一:在构建快照时不计算全局 horizons

这个patch的地址为https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dc7420c2c9274a283779ec19718d2d16323640c0

为了使GetSnapshotData()具有更强的可伸缩性,它不能不查看每个进程的xmin:尽管快照内容不需要在提交只读事务或释放快照时更改,但在这些情况下会修改进程的xmin。xmin修改的频率很快,它会导致GetSnapshotData()中的许多缓存丢失,尽管快照底层的数据没有改变,尤其是在核心计数较高的系统中。这是GetSnapshotData()在大型系统上扩展性差的最重要原因。

这个提交其实只是删除对PGXACT->xmin的访问,让GetSnapshotData()不再需要访问xmins,这本身不会带来显著的改善,但是为后续的几个优化都是针对GetSnapshotData()不需要访问xmins去做的。

二、优化二:将PGXACT->xmin移回PGPROC

这个patch的地址为 https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1f51c17c68d05c28d5b9294d8013cb9e7e653160

早在2011年其实就已经发现了GetSnapshotData存在瓶颈,当时做的优化是把PGPROC里面把快照需要的变量拆出来,放到PGXACT中,这样数据结构小很多,可以装到一个cpu cacheline中。

这个patch它把第一部分GetSnapshotData()不再需要的xmin移回了PGPROC。原本在PGXACT里使用xmin的时候,它比PGXACT里的其他成员更新更频繁,进而导致cacheline有很多不必要的ping-pong,所以又将PGXACT->xmin移回了PGPROC结构体。

这几句话大一看好像有点一头雾水,什么是cacheline,什么是ping-pong。
这里给大家大致解释这几个名词,方便我们更好去理解,文章底部也有我参考的链接。

1、cacheline

内存是DRAM,速度慢,容量大。属于CPU外部设备,通过总线与CPU进行通信。而cache 在 CPU内部,属于片上硬件。所以内存的速度会远远慢于cache。

cache的单位是cacheline,是一块连续的内存。以cacheline 64字节为例。所有的cacheline 又划到各个way下。row: 叫做set。columne: 叫做way


当CPU访问一个内存的时候,通过内存中间的6bits定位在哪个set,再通过24bits定位响应的cacheline。
对同一块cache不停的进行写操作,会增加cache之间更新缓存的花销。包括不停的去刷新主存的内容。缓存的cacheline的state machine 频繁的从 S -> I 状态

2、ping-pong

Ping-pong是一种数据缓冲的手段(是一种数据传输技术),能够同时利用两个相同数据缓冲区达到数据连续传输的目的(对象类型可以是任意的),两者交替地被读和被写,从而提高数据传输速率。

然后再去看开头的那句话,是不是大致理解了,这个patch主要减少了在这个函数里使用xmin所导致的cache之间频繁更新缓存的花销,对于高度并发、快照获取量大、工作负载大的情况,仅此更改就可以显著提高可伸缩性。

三、优化三:将PGXACT->vacuumFlags移动到ProcGlobal->vacuumFlags

这个patch的链接为https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5788e258bb26495fab65ff3aa486268d1c50b123

这个patch把PGXACT->vacuumFlags 移至ProcGlobal,增加了GetSnapshotData()经常需要的数据保存在L2缓存中的机会,L2缓存位于CPU与内存之间的临时存储器,容量比内存小但交换速度快,二级缓存容量大小决定了cpu的性能。

L1 L2 L3缓存和内存的快慢关系,可以参考如下:

L1的存取速度:4个cpu时钟周期
L2的存取速度:11个cpu时钟周期
L3的存取速度:39个cpu时钟周期
RAM的存取速度:107个cpu时钟周期

可以看到,L2缓存的速度比在内存里快,因此这样的改动,相当于加快了GetSnapshotData()执行的速度。

四、优化四:移动subxact信息到ProcGlobal,删除PGXACT

这个patch的链接为https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=73487a60fc1063ba4b5178b69aee4ee210c182c4

与第三个优化的更改类似,这个patch增加了GetSnapshotData()经常需要的数据保存在L2缓存中的机会。在许多workload中,子事务是非常罕见的,这使得检查的代价很小。
把PGXACT的所有成员都转移了,所以不需要再保留它了,因此删除了PGXACT结构体。

五、优化五: 引入正在进行的xid的密集数组

这个patch的链接为https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=941697c3c1ae5d6ee153065adb96e1e63ee11224

之前构建快照时,GetSnapshotData会遍历procArray->pgprocnos找到所有存在的PGPROC、PGXACT结构,收集所有的xid,即通过pgprocnos拿到索引,通过索引在离散的allPgXact数组中拿到xid。而现在的版本,其实改成了将xids单独拿出来放到连续存储的密集数组中,来显著提高其命中率。

六、优化六:使用xact完成计数器缓存快照

这个patch的链接为https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=623a9ba79bbdd11c5eccb30b8bd5c446130e521c

这个提交在VariableCacheData的结构体里引入了xactCompletionCount(VariableCacheData是共享内存中的一个数据结构,用于跟踪OID和XID赋值状态),它跟踪自服务器启动以来以某种形式完成的带有xid(即可能修改了数据库)的Top事务的数量。PostgreSQL-14版本仅用于检查GetSnapshotData()是否需要重新计算快照的内容。只要当前的xactCompletionCount与最初构建快照时相同,就可以避免重新构建快照的内容。
这个改动的意图很明显了,前几个优化都是让计算快照变得更快/更可伸缩,而这个改动是:避免重新构建快照的内容,减少资源占用。(也就是能不重新做快照就不做快照)。

参考列表

1.Improving Postgres Connection Scalability: Snapshots(Andres Freund)
Improving Postgres Connection Scalability: Snapshots
2.cacheline
Cache Line - 简书
3.ping-pong机制
ping-pong机制_c振的博客-CSDN博客_ping-pong
4.德哥的PostgreSQL 20200819当天代码 - 14 对比 13 高并发性能优化 数据对比 - get snapshot improve
blog/20200817_01.md at master · digoal/blog · GitHub

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

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

相关文章

【C++】C/C++内存管理

众所周知&#xff0c;C/C没有内存&#xff08;垃圾&#xff09;回收机制&#xff0c;所以写C/C程序常常会面临内存泄漏等问题。这一节我们一起来学习C/C的内存管理机制&#xff0c;深入了解这套机制有利于我们之后写出更好的C/C程序。 在那些看不到太阳的日子里&#xff0c;别忘…

Spring(九)- Spring自定义命名空间整合第三方框架原理解析

文章目录一、Spring通过命名空间整合第三方框架1. Dubbo 命名空间2. Context 命名空间二、Spring自定义命名空间原理解析三、手写自定义命名空间标签与Spring整合一、Spring通过命名空间整合第三方框架 1. Dubbo 命名空间 Spring 整合其他组件时就不像MyBatis这么简单了&#…

电影影院购票管理系统

1、项目介绍 电影影院购票管理系统拥有两种角色&#xff1a;管理员和用户 管理员&#xff1a;用户管理、影片管理、影厅管理、订单管理、影评管理、排片管理等 用户&#xff1a;登录注册、个人中心、查看电影票、电影选座、下单支付、发布影评、查看票房统计等 2、项目技术 …

14、Horizontal Pod Autoscal

一、为何进行缩扩容&#xff1f; 在实际生产中&#xff0c;经常会遇到某个服务需要扩容的场景&#xff0c;可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。可以利用Deployment/RC的Scale机制来完成这些工作。二、缩扩容模式 Kubernetes 对 Pod 扩容与缩…

mysql-Innodb解析

一.计算机不同介质操作速度 相对于CPU和内存操作&#xff0c; 我们可以看到磁盘的操作延时明显要大得多&#xff0c; 一次磁盘搜索的延时需要10ms。 假入我们某一个业务操作进行了大量磁盘读写&#xff0c; 那可以预料到这个服务的性能肯定是非常差的&#xff0c; 那么到底是什…

3.2文法与语言

1、文法生成语言 推导 定义&#xff1a;当αAβ直接推导出αγβ&#xff0c;即αAβ⇒αγβ&#xff0c;仅当A→γ是一个产生式&#xff0c;且α,β∈(VT∪VN)*。 注&#xff1a;按照我的理解是两个字符串的推导。如果α1⇒α2⇒…⇒αn,则我们称这个序列是从α1到αn的一个…

动态规划01 背包问题(算法)

上篇文章说了&#xff0c;查找组成一个偶数最接近的两个素数算法&#xff1a; 查找组成一个偶数最接近的两个素数https://blog.csdn.net/ke1ying/article/details/127872594 本篇文章题目是 动态规划01 背包问题&#xff1a; 背包容量5kg&#xff0c;现在有三个物体&#xf…

BVH动捕文件导入到E3D骨骼树

BVH动捕文件导入到E3D骨骼树 1. BVH动捕文件 BVH动作捕捉文件有两部分组成&#xff0c;第一部分描述了静止状态下角色的基本骨骼结构&#xff0c;角色通常处于Apose或Tpose姿态下&#xff0e;文本用树状结构描述了各个关节点的相对位置(OFFSET xyz)&#xff0c;连接两关节点的…

学好MySQL增删查改,争取不做CURD程序员【下篇(六个小时肝MySQL万字大总结)】

✨✨hello&#xff0c;愿意点进来的小伙伴们&#xff0c;你们好呐&#xff01; &#x1f43b;&#x1f43b;系列专栏&#xff1a;【MySQL初阶】 &#x1f432;&#x1f432;本篇内容&#xff1a;一套打通MySQL基础操作. &#x1f42f;&#x1f42f;作者简介:一名现大二的三非编…

解决小程序-wx.canvasGetImageData()-RGB取色盘苹果手机获取颜色慢问题

简介 最近做了一个微信小程序控制蓝牙设备&#xff0c;通过小程序中的RGB取色盘&#xff0c;获取当前的RGB颜色&#xff0c;通过蓝牙发送给设备&#xff0c;设备接收到RGB以后&#xff0c;做出相应的调整。 图1&#xff1a;RGB取色盘 在安卓手机上运行正常&#xff0c;能够迅速…

企业实战项目rsync+inotify实现实时同步

目录 一、inotify安装和介绍 1. 安装inotify 2. inotify-tools常用命令 3. rsync inotify 实践 3.1 服务端配置 3.2 客户端配置 一、inotify安装和介绍 1. 安装inotify yum install epel-release -y yum install inotify-tools -y 2. inotify-tools常用命令 inotify-to…

C++ 使用哈希表封装模拟实现unordered_map unordered_set

一、unordered_map unordered_set 和 map set的区别 1. map set底层采取的红黑树的结构&#xff0c;unordered_xxx 底层数据结构是哈希表。unordered_map容器通过key访问单个元素要比map快&#xff0c;但它通常在遍历元素子集的范围迭代方面效率较低。 2. Java中对应的容器名…

vivo和oppo通知权限弹窗

在vivo和oppo部分手机上&#xff0c;首次安装app时&#xff0c;会弹出一个系统级的通知权限弹窗&#xff0c;&#xff08;部分一加手机也会出现&#xff0c;是因为一加手机使用了OPPO的colorOS系统&#xff09;如图。 这个通知权限弹窗比较坑&#xff0c;一来可能不符合产品对…

Word控件Spire.Doc 【文本】教程(21) ;如何在 C# 中用 Word 文档替换文本

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

ARM pwn 入门 (4)

3. callme 本题有多个文件&#xff0c;根据题意来看是需要依次调用callme_one、callme_two、callme_three这3个库函数。这三个函数会进行flag的解密&#xff0c;但是需要满足前三个参数等于特定值。这就需要我们去elf文件中寻找合适的gadget了。 而本题正好给出了一个不能再合…

为什么模板的声明与定义不能分离?

目录 一、模板的好处与注意事项 二、 声明定义为什么不能不放一起&#xff1f; 一、模板的好处与注意事项 模板的好处从下面代码可以体现&#xff1a; template<typename T> void Swap(T& left, T& right) {T temp left;left right;right temp; } int main…

IDEA+MapReduce+Hive综合实践——搜狗日志查询分析

1.下载数据源 打开搜狗实验室链接&#xff1a;搜狗搜索引擎 - 上网从搜狗开始&#xff0c;由于搜狗实验室链接打不开了&#xff0c;所有这里自己制作一份数据进行实验。 SogouQ.txt: 2.上传下载文件至HDFS 2.1将下载的文件通过FinalShell工具上传到Linux系统 2.2SogouQ.txt并…

dev_I_II笔记

dev1 问题 1.model创建不了&#xff1f; 2.从开发界面双击进入后&#xff0c;如何返回&#xff1f; 3.一个客户端界面的所有东西就是一个项目吗&#xff1f;多个项目的数据全部储存在开发界面的aot中&#xff1f; 4.最终的测试是需要完成一个什么东西&#xff1f; 1.学习…

企业微信自定义客户画像

OpenAPI基本介绍 微伴助手开放接口对接文档 version: 0.4 注1&#xff1a;微伴助手开放接口已经开放公测&#xff0c;进入微伴后台-应用管理-API接入以获取企业标识&#xff08;corp_id&#xff09; &#xff0c;企业API调用凭据&#xff08;secret&#xff09; 注2&#xff…

视图相关知识的汇总

重点大纲 描述视图创建&#xff0c;改变视图的定义&#xff0c;删除视图通过视图重新找回数据通过视图插入&#xff0c;更新和删除数据创建和使用inline视图执行Top-N 分析什么是视图&#xff1f; 视图是基于一张表或者另一张视图的逻辑表。 视图本身不包含数据。视图被存储在…