首页 > 其他分享 >借鉴openguass ,Clog锁优化的可行性调研分析与改进方案

借鉴openguass ,Clog锁优化的可行性调研分析与改进方案

时间:2024-10-31 11:35:06浏览次数:4  
标签:状态 openguass clog xid 可行性 CLOG 事务 PER Clog

一 、clog的作用与分析

1. clog作用及功能

Clog是记录事务状态的日志,由于其多版本特性,因此需要提交日志clog来记录事务的状态,从而判断其可见性。Clog分配于共享内存中,并作用于事务处理过程的全过程。
在PG数据库中事务状态有四种,分别是:IN_PROGRESS、COMMITED、ABORTED和SUB_COMMITED
例如事务正在运行中,那么它的状态就是IN_PROGRESS。PG中是通过clog来存储事务xid和 事务xid对应的状态。 因此,若取消一个执行很长时间的事务,就可以基本在瞬间处理完成,只需要将事务状态从IN_PROGRESS设置成ABORTED即可;而Oracle却要等待undo表空间中的内容回滚完。

2. Clog源码分析

在clog.c文件中定义了,一个事务状态占用2bits,一个字节能表示4个事务状态,一个页表示 页的字节数*4 个 事务状态,一般一个页的大小位8K,即能表示32,768个事务状态 。

/* We need two bits per xact, so four xacts fit in a byte */
#define CLOG_BITS_PER_XACT  2   // each trancsation status use 2 bits
#define CLOG_XACTS_PER_BYTE 4   // each byte has 4 transactions's status 
#define CLOG_XACTS_PER_PAGE (BLCKSZ * CLOG_XACTS_PER_BYTE)  // each page has 8K*4 transactions status
#define CLOG_XACT_BITMASK   ((1 << CLOG_BITS_PER_XACT) - 1) // 掩位码

事务id可以通过与CLOG_XACTS_PER_PAGE做除法来确定此事务的状态在第几个页上,对CLOG_XACTS_PER_PAGE取余来确定在某页的字节偏移位置 ,用字节偏移位置除以每字节最大事务状态数得到其具体位置。

#define TransactionIdToPage(xid)    ((xid) / (TransactionId) CLOG_XACTS_PER_PAGE)   // transactionID in which CLog page
#define TransactionIdToPgIndex(xid) ((xid) % (TransactionId) CLOG_XACTS_PER_PAGE)
#define TransactionIdToByte(xid)    (TransactionIdToPgIndex(xid) / CLOG_XACTS_PER_BYTE)
#define TransactionIdToBIndex(xid)  ((xid) % (TransactionId) CLOG_XACTS_PER_BYTE)

Clog写事务状态主要函数调用流程:

image

在clog事务状态写的过程实际上是写进缓冲区,并非是直接写进文件,这样的好处是减少磁盘的IO,提高性能,实际上的写文件操作是在SLRU里进行,其逻辑大体如下 :
先获取一个缓冲区buf页用来保存事务状态,在这其中就需要查找是否存在空的缓存页,如果有就用空页来写,否则就用LRU淘汰算法置换出一个页。在置换过程中要对页内的数据进行脏页判断,若是脏页就进行写文件操作,否则就直接清空来给新来事务使用。页内数据不仅是保存事务状态,在事务进行可见性判断的时候也会用到其内容进行事务可见性判断,或是获取某个事务状态等操作。流程图如下:

image

整个过程都是在XactSLRULock保护下进行,来保证写入的页的数据的真实可靠。Buf置换的时候还有相应的buf锁来保护,buf锁具有多个,根据buf页来使用,buf页的数量范围是4~128。

Size
CLOGShmemBuffers(void)
{
    return Min(128, Max(4, NBuffers / 512));
}
……………………
typedef struct SlruSharedData
{
LWLock     *ControlLock;  /* 页锁 */
………………………………
LWLockPadded *buffer_locks; /* buf锁  */
………………………………
}SlruSharedData;

Clog整个过程如下:
image

二 、clog性能瓶颈

虽然Clog的事务状态处理非常的迅速,但是在某个表存在大量回滚的情况下,若是查询此表必然会进行扫描其clog的事务状态,性能肯定会很低。PG为解决此问题设计了一个缓冲池来缓存某些事务的状态。先将记录保存在缓冲池中,若缓冲池空间用尽则会利用LRU淘汰算法刷写到磁盘,若某些记录已经被记录则会直接替换新事务记录。
而缓冲池就要用到锁的保护,缓冲池内操作数据需要在锁的保护下进行才能保证数据的真实可靠,并且不会丢失与乱序。经过对代码的研读发现LRU页锁只有一个而缓冲buf锁却有4~128个,在高并发情况下必然会导致锁竞争,只有一个页锁的情况下,竞争尤为激烈,从而降低PG整体性能。

三、改进思路

经过调研,发现opengauss数据库对clog的缓冲池锁进行了分区处理,以达到在高并发下极大减少锁竞争,使得clog也可以高并发处理。我的思路是将opengauss对clog中SLRU锁的分区处理的思路应用于PG数据库上。本质是将一个锁变为多个锁,用页号(pageno)来哈希分区。在原有的轻量级锁(LWLock)上进行改进扩充,作为clogpartitionslocks,之后将页号对锁clogpartitionslocks的数量取余哈希到对应的锁上。优化模型图如下:

image

在考虑使用pageno作为页号进行所分区时,要分析子事务与主事务的记录是否从同一个页上的问题,即边界问题,这个问题pg本身已经帮我们解决,在调用clog模块的时候会先进行事务id对应的页号判断,如果其中一个或几个子事务的id映射的页号与主事务不在同一页上则会跳出此页的写操作,在另一个页上进行事务的写。因此将原先的轻量级锁改成用pageno哈希的分区锁是可行的,将一个锁扩到256个锁,在高并发写事务状态的情况下必然会大幅降低锁的竞争与等待, 高并发下性能将会得到一定量的提升。

代码实现可供参考:gitee(仅供参考)

标签:状态,openguass,clog,xid,可行性,CLOG,事务,PER,Clog
From: https://www.cnblogs.com/supersimple/p/18517333

相关文章

  • 社区智慧养老信息化如何落地,全面剖析其真实性与可行性
    养老问题日益成为社会关注的焦点。社区智慧养老作为一种创新的养老模式,近年来逐渐走入人们的视野。然而,对于社区智慧养老的真实性与可行性,人们仍存在诸多疑问。一、社区智慧养老的概念与内涵社区智慧养老是利用信息技术等手段,整合社区内各种养老资源,为老年人提供更加便捷、高效......
  • 可行性分析&产品规划&立项评审
    一:可行性分析的特点产品可行性分析应具有预见性、公正性、可靠性、科学性特点:市场需求:市场:目标市场现状、规模、趋势、市场的产品格局,主要问题和机会壁垒用户:目标用户群体、用户特征、用户画像、用户使用场景、用户需求总结竞品:竞品战略、竞品用户定位、竞品核心业务、竞品主要......
  • 容器云平台建设可行性分析报告
    一、项目背景和原因1.1什么是容器云1.2容器和虚拟机的区别1.3为什么要建设容器云1.4我们的建设目标1.5建设过程可能存在的风险二、容器云PaaS平台构建2.1总体技术架构2.2设计原则2.3总计规划三、容器云平台关键技术选型3.1容器......
  • 程序员转行须知:深思熟虑后再做决定——评估转行至大模型领域的可行性
    在当今的AI时代,程序员的工作模式已经受到了很大的冲击。随着AI大模型的快速发展和应用,传统初级程序员的工作确实是大受影响,这些人员的工作主要是功能实现和重复场景实现。而现在,越来越多的工具可以帮助程序员提高效率,如GithubCopilot等。这些工具可以理解上下文的语义,并且......
  • openGuass——表空间、数据库、Schema详解
    目录一、表空间二、数据库三、模式:Schema四、databaseschematable之间的关系五、表六、分区表七、索引八、视图九、序列十、同义词十一、约束一、表空间自带了两个表空间:pg_default和pg_global。查看命令:\db默认表空间pg_default:用来存储非共享系统表、用......
  • IP代理可以做爬虫吗?探讨其可行性与相应实践
    IP代理在网络爬虫中的应用在网络爬虫的世界里,IP代理就像是爬虫的“隐形斗篷”,帮助它们在获取数据的过程中隐藏真实身份,避免被目标网站识别和封禁。那么,IP代理到底能否用于爬虫呢?答案是肯定的!接下来,我们将深入探讨IP代理在爬虫中的重要性、工作原理以及使用时需要注意的事项。......
  • OceanBase-clog、日志-队列积压-dump tenant info
    dumptenantinfo日志中搜索dumptenantinfo关键字,可看到租户的规格,线程,队列,请求统计等信息。这条日志每个租户每10s打印一次。查询办法:  grep'dumptenantinfo.*observer.log日志:tenant={id:1002'log/observer.log.*[2021-05-1016:56:22.564978]INFO [SERVER.OMT]......
  • OceanBase -clog、日志-查看unit迁移过程中副本数变化
    查看unit迁移过程中副本数变化----------------------------------------------------------------------------------------------------------------------------第一:在副本迁移时候,可以查询以下SQL进行观察(适用2.X/3.X)查看副本数selectcount(*)from__all_virtual_m......
  • 数字孪生的实现方案及可行性分析
    简介数字孪生(DigitalTwins):就好比你有一个双胞胎兄弟,你们长得一模一样,但一个是活在现实里的真人,另一个是活在电脑里的虚拟人。这个虚拟的兄弟,就是你的“数字孪生”。在现实世界中,数字孪生通常指的是通过各种数据和先进的技术手段,创建一个真实物体或系统的虚拟副本。这个副本......
  • 【C++】C++标准库iostream中cin、cout、cerr、clog方法解析
    目录一.iostream库介绍1.iostream主要的组件2.使用 iostream 二.cin介绍及使用三.cout介绍及使用四.cerr介绍及使用五.clog介绍及使用一.iostream库介绍1.iostream主要的组件在C++中, iostream 是一个非常核心的头文件,它定义了基本的输入输出流。这个头文件是......