`

PostgreSQL启动过程中的那些事十八:bgwriter进程二

阅读更多

 3

       这节主要讨论 bgwriter 进程到了 BackgroundWriterMain ,设置合适的信号处理句柄, 创建一个资源属主以保持对本进程资源的跟踪 创建一个本进程的所有工作都在其内做的内存上下文 "Background Writer" ,创建这个内存上下文是为了本进程在错误恢复期间能重置 context 并且因此避免可能的内存泄漏。 设置错误跳跃点。接着不堵塞信号(当 postmaster 进程 fork 本进程时用 PG_SETMASK(&BlockSig) 堵塞了他们)。然后进入无限循环,检查并处理任何请求或者最近收到的信号。如果请求了检查 点,就根据情况做一个重启点或做一个检查点;如果没请求检查点,就做一个脏缓存写。然后再接着循环。

 

BackgroundWriterMain 方法的调用序列图

 

 

 

BackgroundWriterMain 方法的调用序列图

 

 

4

下面是 BackgroundWriterMain 流程示意图。


 

BackgroundWriterMain 流程示意图

    BackgroundWriterMain 中主要是根据情况看是否有创建检查点请求,如果有,再进一步根据情况判断是要做一个重启点还是要创建一个检查点,根据情况调用 CreateCheckPoint CreateRestartPoint 方法;如果没有请求检查点,调用 BgBuffferSync 方法做脏缓存写。

 

5

       其中 CreateCheckPoint 方法创建检查点的具体情况参见《 PostgreSQL 启动过程中的那些事十六:启动进程二》。创建重启点的 CreateRestartPoint 方法和 创建检查点相似,但被用于 WAL 恢复期间创建一个点,如果重启,恢复可以从这个点继续前滚而不用重放整个恢复日志。

 


 

CreateRestartPoint 流程示意图

    创建重启点主要是为恢复重启保持一个合适的检查点,这个检查点必须是一个安全的重启点。如果可能创建一个重启点,创建重启点主要是把数据库系统共享内存中的数据全部刷出到磁盘,并把可以安全重启的检查点存入控制文件和共享内存中相关变量,详细信息参见上面的“ CreateRestartPoint 流程示意图”。

 

6

BgBuffferSync 方法根据策略调用 SyncOneBuffer 把需要同步的脏缓存块逐个写出。 pg 里缓存池里的所有缓存块是由以 Nbuffers BufferDesc 结构数组里的 freeNext 组成的空闲缓存链表和一个查找缓存的哈西表索引 Shared Buffer Lookup Table ”(参见《 PostgreSQL 启动过程中的那些事七: shmem 中初始化 BufferPool 》)进行管理。其中, SyncOneBuffer() -> FlushBuffer() -> smgrwrite() ,在存储管理器 smgr smgrwrite 方法里根据 smgr 的接口 smgr_write 和规则转到磁盘 md mdwrite 方法。 mdwrite 方法不是同步写——在返回时块不是必须在磁盘上,其只是把这个缓存块的内容传到 OS kernel ,最终调用 OS Write 接口, kernel 再根据情况安排写磁盘任务。但是,在下一次检查点记录到 WAL 日志前通过文件同步 fsync 我们将强制将这些改变的缓存块写到磁盘。

BgBuffferSync 方法里多次提到 clock sweep 算法, clock sweep 算法是缓存池替换时使用的算法,其开始一个循环次数上限为 tryCounter=NBuffers 的循环来检查缓存池里的空闲缓存块,当找到一个引用计数 refCount 0 但最近使用过( usage_count 不等于 0 )的缓存块时将 usage_count 1 ,接着重新设置 tryCounter=NBuffers 并继续遍历,直到有缓存块的 refCount usage_count 都为 0 ,则其最近较少使用,可以被替换掉。

 


------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
 

 

 

  • 大小: 68.2 KB
  • 大小: 119.2 KB
  • 大小: 115.9 KB
10
15
分享到:
评论

相关推荐

    PostgreSQL中文手册9.2

    一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...

    关于PostGreSQL中的存储过程

    其中,存储过程是一个非常重要的概念,本文将对 PostgreSQL 中的存储过程进行详细的介绍和解释。 什么是存储过程 存储过程是一组为了完成特定任务而编写的 SQL 语句集合。它可以将复杂的操作封装起来,以便于重复...

    Postgresql存储过程

    Postgresql存储过程是指在Postgresql数据库中定义的一组SQL语句的集合,它可以完成复杂的操作,并且可以重复使用。Postgresql存储过程可以用来实现业务逻辑,减少数据库服务器的压力和网络传输的数据量。 一、存储...

    PostgreSQL 存储过程调试

    PostgreSQL的存储过程是由一系列SQL语句组成的代码块,可以被多次调用并执行,类似于编程语言中的函数。调试存储过程有助于理解其内部逻辑,查找并修复潜在的错误或性能瓶颈。 1. **调试环境设置** 调试PostgreSQL...

    postgresql-42.3.1-API文档-中文版.zip

    赠送jar包:postgresql-42.3.1.jar; 赠送原API文档:postgresql-42.3.1-javadoc.jar; 赠送源代码:postgresql-42.3.1-sources.jar; 赠送Maven依赖信息文件:postgresql-42.3.1.pom; 包含翻译后的API文档:...

    Go-PostgreSQLBGWorker用Go编写的PostgreSQL后台工作进程

    在PostgreSQL中,BGWorker是用户定义的后台进程,它们不是作为数据库服务器的一部分启动,而是由服务器启动并在需要时执行特定的任务。这种设计使得BGWorker能够执行长时间运行的操作,而不阻塞主线程或影响其他...

    postgresql--内核分析--多进程结构

    ### PostgreSQL内核分析——多进程结构 #### 一、进程的理解与创建 进程是一个正在运行的程序实例,它具有动态的特性。对于程序员而言,所编写的代码在未经编译之前仅是静态的源代码。当这些代码经过编译、链接等...

    PostgreSQL修炼之道 从小工到专家.pptx

    PostgreSQL修炼之道:从小工到专家 PostgreSQL是一种功能强大且广泛应用的开源关系型数据库管理系统,本书《PostgreSQL修炼之道:从小工到专家》旨在帮助读者深入理解PostgreSQL的核心原理和最佳实践,从而提升...

    一套C#与PostgreSQL数据库完美结合的实例

    本套程序是在VS2005下C#开发,...在对PostgreSQL数据库进行操作时,用到了如何调用存储过程来完成各项操作。 将App_Data下的数据库文件导入到PostgreSQL 8.3版里面,库名为:HYGL 然后修改web.config中的配置即可使用

    jeecgboot(postgreSQL).pdf

    在转换过程中,需要注意以下几点: * 将 MySQL 的 tinyint 类型转换为 PostgreSQL 的 int2 类型,这可能会导致实体属性类型不匹配的问题。 * 将 MySQL 的 hidden 类型转换为 PostgreSQL 的 int4 类型,这可能会导致...

    PostGreSQL安装部署系列:Centos 7.9 安装指定PostGreSQL-15版本数据库

    初始化数据库是PostgreSQL安装过程中必不可少的一步,可以通过执行以下命令完成: ```bash sudo /usr/pgsql-15/bin/postgresql-15-setup initdb ``` 初始化完成后,将会创建数据库目录并设置默认权限。 ##### 3.4...

    Linux下PostgreSQL安装与开机启动

    ### Linux下PostgreSQL安装与开机启动详解 #### 1. 添加用户及创建目录 为了确保PostgreSQL服务的安全性,我们通常会为它创建一个独立的系统用户。这一步骤包括了用户创建、密码设定以及相关目录的搭建。 ##### ...

    postgresql-42.2.2-API文档-中文版.zip

    赠送jar包:postgresql-42.2.2.jar; 赠送原API文档:postgresql-42.2.2-javadoc.jar; 赠送源代码:postgresql-42.2.2-sources.jar; 赠送Maven依赖信息文件:postgresql-42.2.2.pom; 包含翻译后的API文档:...

    PostgreSQL 14.1 中文手册

    PostgreSQL 14.1 手册 PostgreSQL 全球开发组 翻译:彭煜玮1,PostgreSQL中文社区2文档翻译组

    postgresql存储过程

    PostgreSQL存储过程是一种数据库编程的方法,它允许用户在数据库中定义和执行复杂的操作逻辑,而不仅仅是简单的查询。存储过程在数据库管理系统中起着至关重要的作用,它们可以提高性能,增加安全性,减少网络流量,...

    Postgresql存储过程.docx

    PostgreSQL 存储过程中的连接字符不是 `+`,而是使用 `||`。例如: ``` str := 'hello' || 'world'; ``` 四、控制结构 PostgreSQL 存储过程支持多种控制结构,包括条件语句、循环语句和跳转语句。 1. 条件语句 ...

    postgresql-42.2.5-API文档-中英对照版.zip

    赠送jar包:postgresql-42.2.5.jar; 赠送原API文档:postgresql-42.2.5-javadoc.jar; 赠送源代码:postgresql-42.2.5-sources.jar; 赠送Maven依赖信息文件:postgresql-42.2.5.pom; 包含翻译后的API文档:...

    PostgreSQL修炼之道:从小工到专家

    PostgreSQL中国社区资深数据库专家、沃趣科技首席数据库架构师撰写,PostgreSQL数据库领域经典著作 系统讲解PostgreSQL技术内幕,深入分析PostgreSQL特色功能,包含大量来自实际生产环境的经典案例和经验总结 ...

    PostgreSQL内核分析

    在启动过程中,`postmaster`会执行一系列初始化操作,比如创建共享内存段、设置信号处理程序等。初始化完成后,通过`ServerLoop`函数进入循环状态,等待并处理来自客户端的连接请求。对于崩溃或异常终止的子进程,`...

    postgresql ubantu离线安装版

    PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它在Ubuntu操作系统上广泛使用,尤其在需要稳定性和高性能的环境中。Ubuntu离线安装版的PostgreSQL适用于那些没有互联网连接或者网络带宽有限的环境,...

Global site tag (gtag.js) - Google Analytics