love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

MogDB学习笔记系列之 — 认识 pagewrite线程

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: MogDB学习笔记系列之 — 认识 pagewrite线程

在前面的MogDB学习系列中,我们了解了核心的bgwriter进程,今天继续来学习另外一个主要的线程,即pagewriter;首先来看下数据库相关的参数设置:

 

从上面的参数来看,我们可以知道pagewriter线程的数量由参数 pagewriter_thread_num来控制;默认情况下一共有2个pagewriter线程。
其中一个是master主线程。从MogDB官方文档来看,pagewriter主要负责从全局脏页队列中获取脏页,然后将其写入double write文件。由于有多个pagewriter线程,
那么是如何工作和协调的呢? 毫无疑问,是主线程扫描到需要写入的脏页后,将其分发个其他pagewriter线程,最终写入文件系统落盘。

其次从另外一个参数pagewriter_sleep参数来看,表示pagewriter线程的唤醒睡眠时间,单位是ms。这跟增量检查点有关。也就是说该参数
设置后,pagewirter线程会间隔2s(默认值)开始扫描脏页并进行刷新,这同时也推进了数据库检查点。

不过这里需要注意的是,如果当shared_buffers中的脏页过多,页比例达到dirty_page_percent_max设置时,每次刷新脏页的的数量将会更大;
将会根据max_io_capacity 来进行计算。

接下来我们简单做一下测试,跟踪一下pagewriter线程,观察一下相关的操作,是否如上面所讲:

其中26号文件是double writer文件。另外发现pagewriter线程还会写其他文件,比如94号文件,查下发现是如下对象:

看到这个pg_toast 表还是非常奇怪,查询了相关材料发现,这是PostgreSQL特有的机制之一。对于PostgreSQL而言,页是数据在文件存储中的基本单位,默认大小为8192 byte。同时,PostgreSQL不允许一行数据跨页存储,那么对于超长的行数据,就会启动TOAST,具体就是采用压缩和切片的方式。如果启用了切片,实际数据存储在另一张系统表的多个行中,
这就叫TOAST表,这种存储方式叫行外存储。由于MogDB沿用了opengauss内核,而openGauss内核又是基于PostgreSQL 9.2.4 进化而来,因此不难看出,这仍然是用了原生PostgreSQL的一些机制。

最后简单总结一下pagewriter线程的作用:

1、扫描share_buffers中的脏页链表,获取脏页,同时将脏页写入到double write文件。
2、推进检查点(实际上是增量检查点).

 

Leave a Reply

You must be logged in to post a comment.