postgresql15 内核源码分析-buffer查找接口

这篇具有很好参考价值的文章主要介绍了postgresql15 内核源码分析-buffer查找接口。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 

 文章来源地址https://www.toymoban.com/news/detail-406757.html

 

  • 专栏内容:postgresql内核源码分析
  • 个人主页:我的主页
  • 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

目录

前言

概述

接口介绍

调用场景分析

详细分解

结尾


前言

本文是基于postgresql 15的代码进行分析解读,演示是在centos8系统上进行。


 

概述

在postgresql中,SQL引擎使用表文件中的数据时,先读入共享缓冲区,修改时也先在缓冲区进行修改,而后通过缓冲区替换算法,定时脏页落盘等机制将数据写入磁盘。共享缓冲区是由buffer数组构成,每一个buffer对应数据文件中的一个page,默认配置时就是8K。

 

前面介绍过缓冲区替换算法及查找流程,本文对查找接口进行分享介绍。

 

接口介绍

在postgresql 主要有六种查找buffer的接口,分别在不同场景下,以提升性能。

extern PrefetchBufferResult PrefetchSharedBuffer(struct SMgrRelationData *smgr_reln,

 ForkNumber forkNum,

 BlockNumber blockNum);

extern PrefetchBufferResult PrefetchBuffer(Relation reln, ForkNumber forkNum,

   BlockNumber blockNum);

extern bool ReadRecentBuffer(RelFileLocator rlocator, ForkNumber forkNum,

 BlockNumber blockNum, Buffer recent_buffer);



extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);

extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum,

 BlockNumber blockNum, ReadBufferMode mode,

 BufferAccessStrategy strategy);

extern Buffer ReadBufferWithoutRelcache(RelFileLocator rlocator,

ForkNumber forkNum, BlockNumber blockNum,

ReadBufferMode mode, BufferAccessStrategy strategy,

bool permanent);

 

调用场景分析

 

ReadBuffer

最简单的调用,对于普通表常用,因为只能MAIN_FORKNUM,默认访问策略,也就是NULL

ReadBufferExtended

比较灵活,可以指定forknum, mode, strategy,ReadBuffer内部也是调用此接口

ReadBufferWithoutRelcache

一般在拷贝database或table,replay wal时调用

ReadRecentBuffer

主要在replay wal时调用,与ReadBuffer相比,此接口不会去查buffer mapping hash

PrefetchBuffer

在lazyvacuum时调用,扫描表的尾部的pages

PrefetchSharedBuffer

在PrefetchBuffer会调用;此外在replay wal时调用,提前加载WAL涉及的buffer来加速

 

详细分解

查找buffer会有以下几种情况:

(1) 在BufferMapping hash中找到,说明当前查找的tag已经有buffer存在,直接使用buffer id再查看buffer的有效性;查找到后,需要在第一时间加pin,再释放buffermapping hash段锁;

当前buffer可能有三种情况:

一种是buffer数据已经加载成功,也就是BM_VALID,此时加pin使用即可;

另一种是当前buffer只是tag设置成功了,数据还没有加载成功,有其它backend正在加载,那么此时就等待IO完成;

还有一种情况是,tag设置成功了,数据还没有加载成功,而且没有其它backend设置IO_IN_PROGRESS,那么当前进程负责加载数据;

 

(2)如果hash中没有找到,说明当前的tag没有buffer,需要使用替换算法找到一个buffer,第一时间进行增加引用计数,加pin;再看此buffer是否需要刷盘或者不符合替换;找到待替换的buffer时,需要持有描述符锁,直到加pin完成才释放,避免其它backend争抢;

对于替换算法找到的buffer会存在几种情况:

一是当前buffer为脏,需要刷盘;先加内容锁,如果加上再进行判断,如果buffer对应的WAL还没有落盘时,需要重新找替换块;不符合当前替换策略时,会将当前块从查找环中踢除,然后重新查找替换块;如果加不上内容锁,说明有backend正在修改,也会放弃重新找替换块;

二是当前buffer已经有tag的,可能是非脏块,需要对替换块对应的buffermapping 段加锁;此处要对新旧tag都要加锁,注意加锁顺序,避够死锁;

三是buffer当前是无效的,可能是没有被用过,就直接替换;

四是在替换过程中,其它backend又加pin使用甚至修改变脏页,此时也需要重新查找替换块;

 

(3)在新旧tag替换时,先加入buffermapping中,此时有可能此它backend已经加进入去了,那么加pin,等待加载磁盘;如果是新加入buffermapping中,那么修改buffer tag,然后修改buffer 描述符的state;然后启动Io加载磁盘;


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

 

到了这里,关于postgresql15 内核源码分析-buffer查找接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • postgresql 内核源码分析 事务提交回滚状态记录 clog机制流程,commit log文件格式,事务状态为什么单独记录的原因,分组优化及leader更新机制

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. PostgreSQL是一种开源的关系型数据库管理系统,其内核源码的分析对于深入理

    2024年02月08日
    浏览(46)
  • Postgresql源码(110)分析dsm动态共享内存分配与共享内存mq实例(dsm/toc接口备忘录)

    相关 《Postgresql源码(90)共享内存申请CreateSharedMemoryAndSemaphores》 《Linux内存映射函数mmap与匿名内存块》 《Linux共享内存与子进程继承》 用dsm框架的流程 评估共享内存大小:多次用shm_toc_estimate_chunk、shm_toc_estimate_keys向estimate中增加数据结构,最后用shm_toc_estimate得出刚才增加

    2024年02月14日
    浏览(47)
  • 【PostgreSQL内核学习(一)—— Ubuntu源码安装PostgreSQL】

    下载地址:https://www.postgresql.org/ftp/source/v10.1/ 执行命令: 解压成功后显示: 出现问题: 解决方法:执行以下命令。 执行命令: 注意:如果希望后续在gdb时可以查看代码,则需要添加–enable-debug make时出现错误: 解决方法:找到 copy_fetch.c 文件。 文件路径如下: /home/jia/pg

    2024年02月16日
    浏览(47)
  • 【PostgreSQL内核学习(二)—— 查询分析】

    声明 :本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。 本文主要参考了《PostgresSQL数据库内核分析》一书   在PostgreSQL中, 查询处理 是指 处理和执行SQL查询语句的整个过

    2024年02月17日
    浏览(46)
  • 源码编译安装POSTGRESQL15

    安装 ./Anaconda3-2021.11-Linux-x86_64.sh 初始化数据库 修改配置文件 启动数据库 重新加载配置文件

    2024年02月13日
    浏览(50)
  • postgresql内核分析 spinlock与lwlock原理与实现机制

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 个人主页 :我的主页 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. ======================================== 在postgresql 中,有大量的并发同步,所以避免不了使用很多保护锁。 同时为了提升并发的性能,

    2024年02月13日
    浏览(37)
  • Linux 源码安装: PostgreSQL 15.6数据库

    💖The Begin💖点点关注,收藏不迷路💖 🍒 PostgreSQL 中文文档 下载地址:https://www.postgresql.org/ftp/source/ 安装结果: vi ~/.bashrc ,如果全局的则编辑/etc/profile。 可以执行以下命令查看 PostgreSQL 版本信息: 1、创建一个名为 postgresql.service 的服务单元文件: 编辑 /etc/systemd/system/p

    2024年03月24日
    浏览(72)
  • openEuler 22.03 LTS 上源码安装 PostgreSQL 15

    6.1 创建数据目录 6.2 切换到 postgres 操作系统用户 6.3 初始化数据库 6.4 启动数据库 把 start 改为 stop 就是停止。 7.1 以管理员的身份配置/etc/profile 在/etc/profile.d 目录下新增 postgresql.sh 文件,内容如下 7.2 设置开机自动启动 (1)创建启动文件 在/usr/lib/systemd/system 下创建文件 po

    2024年02月20日
    浏览(36)
  • Linux内核源码分析 (A)常见内核面试题

    系统调用 do_fork() : copy_process() 定时中断 do_timer() 唤醒进程 wake_up_process() :进程由睡眠状态转为 RUNNING 状态 系统调用 sys_sched_yield() 改变进程的调度策略 sched_setscheduler() : 什么情况下会发生调度时机:阻塞操作、中断返回之前(系统调用返回用户空间时)、被唤醒的进程会

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包