MogDB 学习笔记之 -- 了解 pagewriter 线程

本文出处:https://www.modb.pro/db/183172

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

postgres=# select name,setting,category,context from pg_settings where name like '%pagewrit%';

name | setting | category | context

-----------------------+---------+-------------------------------------+------------

log_pagewriter | off | Reporting and Logging / What to Log | sighup

pagewriter_sleep | 2000 | Write-Ahead Log / Checkpoints | sighup

pagewriter_thread_num | 2 | Write-Ahead Log / Checkpoints | postmaster

(3 rows)

从上面的参数来看,我们可以知道 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 线程,观察一下相关的操作,是否如上面所讲:

[omm@mogdb ~]$ ps -ef|grep mogdb|grep -v grep

avahi 9129 1 0 01:02 ? 00:00:03 avahi-daemon: running [mogdb.local]

omm 14421 1 99 05:05 pts/1 00:05:46 /data/mogdb/bin/mogdb -D /data/mogdb_b75b585a/data/db1

[omm@mogdb ~]$ ps -T -p 14421

PID SPID TTY TIME CMD

14421 14421 pts/1 00:00:02 mogdb

14421 14422 pts/1 00:00:00 jemalloc_bg_thd

14421 14425 pts/1 00:00:00 mogdb

14421 14426 pts/1 00:00:00 syslogger

14421 14427 pts/1 00:00:00 jemalloc_bg_thd

14421 14428 pts/1 00:00:00 alarm

14421 14429 pts/1 00:00:00 jemalloc_bg_thd

14421 14430 pts/1 00:00:00 reaper

14421 14431 pts/1 00:00:00 jemalloc_bg_thd

14421 14456 pts/1 00:00:00 checkpointer

14421 14457 pts/1 00:00:01 pagewriter

14421 14460 pts/1 00:00:00 pagewriter

14421 14461 pts/1 00:00:00 bgwriter

14421 14462 pts/1 00:00:00 bgwriter

14421 14463 pts/1 00:00:00 CBMwriter

14421 14464 pts/1 00:04:20 WALwriter

14421 14465 pts/1 00:00:00 WALwriteraux

14421 14466 pts/1 00:00:00 AVClauncher

14421 14467 pts/1 00:00:00 Jobscheduler

14421 14468 pts/1 00:00:00 statscollector

14421 14469 pts/1 00:00:00 snapshotworker

14421 14470 pts/1 00:01:24 percentworker

14421 14471 pts/1 00:00:02 ashworker

14421 14472 pts/1 00:00:00 TrackStmtWorker

14421 14473 pts/1 00:00:00 auditor

14421 14474 pts/1 00:00:00 2pccleaner

14421 14475 pts/1 00:00:00 faultmonitor

14421 14487 pts/1 00:00:00 worker

下面创建一些测试表来进行一些探索。

enmotech=# create table test1123 as select * from pg_settings;

INSERT 0 601

enmotech=# insert into test1123 select * from test1123;

INSERT 0 601

enmotech=# insert into test1123 select * from test1123;

INSERT 0 1202

enmotech=# insert into test1123 select * from test1123;

INSERT 0 2404

enmotech=# insert into test1123 select * from test1123;

INSERT 0 4808

enmotech=# insert into test1123 select * from test1123;

INSERT 0 9616

enmotech=# insert into test1123 select * from test1123;

INSERT 0 19232

enmotech=# insert into test1123 select * from test1123;

INSERT 0 38464

enmotech=# select pg_relation_filepath('test1123');

pg_relation_filepath

base/16423/16453

(1 row)

enmotech=# insert into test1123 select * from test1123;

INSERT 0 76928

enmotech=#

enmotech=# vacuum test1123;

VACUUM

enmotech=# vacuum test1123;

VACUUM

enmotech=# vacuum test1123;

VACUUM

enmotech=# SELECT OID,relname FROM pg_class where OID=16456;

oid | relname

-------+----------------

16456 | pg_toast_16453

(1 row)

复制

这时候我们打开 strace 对 page write 线程做一个跟踪。

[omm@mogdb ~]$ strace -fr -o /tmp/14457.log -p 14457

strace: Process 14457 attached with 28 threads

strace: Process 14625 attached

strace: Process 14626 attached

strace: Process 14627 attached

strace: Process 14628 attached

strace: Process 14637 attached

strace: Process 14638 attached

strace: Process 14639 attached

^Cstrace: Process 14457 detached

strace: Process 14421 detached

strace: Process 14422 detached

strace: Process 14425 detached

strace: Process 14426 detached

strace: Process 14427 detached

strace: Process 14428 detached

strace: Process 14429 detached

strace: Process 14430 detached

strace: Process 14431 detached

strace: Process 14456 detached

strace: Process 14460 detached

strace: Process 14461 detached

strace: Process 14462 detached

strace: Process 14463 detached

strace: Process 14464 detached

strace: Process 14465 detached

strace: Process 14466 detached

strace: Process 14467 detached

strace: Process 14468 detached

strace: Process 14469 detached

strace: Process 14470 detached

strace: Process 14471 detached

strace: Process 14472 detached

strace: Process 14473 detached

strace: Process 14474 detached

strace: Process 14475 detached

strace: Process 14487 detached

这里我跟踪了多次,包括在进行 vcauum 操作时。

获取相关操作文件的句柄信息:

[root@mogdb fd]# ls -ltr

total 0

l-wx------. 1 omm dbgrp 64 Nov 23 05:09 2 -> pipe:[130481]

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 97 -> /data/mogdb_b75b585a/data/db1/base/16423/14707

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 96 -> /data/mogdb_b75b585a/data/db1/base/16423/14706

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 95 -> /data/mogdb_b75b585a/data/db1/base/16423/16458

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 94 -> /data/mogdb_b75b585a/data/db1/base/16423/16456

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 93 -> /data/mogdb_b75b585a/data/db1/base/16423/14737

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 92 -> /data/mogdb_b75b585a/data/db1/base/16423/14737_fsm

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 91 -> /data/mogdb_b75b585a/data/db1/base/16423/14692

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 90 -> /data/mogdb_b75b585a/data/db1/base/16423/14692_fsm

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 9 -> socket:[130470]

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 89 -> /data/mogdb_b75b585a/data/db1/base/16423/14703_fsm

......

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 41 -> pipe:[129754]

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 40 -> pipe:[130495]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 4 -> /var/log/mogdb/omm/bin/gs_obs/gs_obs.interface.log

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 39 -> pipe:[130490]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 38 -> pipe:[129753]

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 37 -> pipe:[129753]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 36 -> pipe:[129752]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 35 -> pipe:[129756]

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 34 -> pipe:[129756]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 33 -> pipe:[130486]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 32 -> pipe:[129751]

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 31 -> pipe:[129751]

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 30 -> pipe:[130486]

l-wx------. 1 omm dbgrp 64 Nov 23 05:11 3 -> /data/mogdb_b75b585a/data/db1/pg_ctl.lock

lr-x------. 1 omm dbgrp 64 Nov 23 05:11 29 -> pipe:[129752]

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 28 -> /data/mogdb_b75b585a/data/db1/pg_cbm/pg_xlog_1_0000000009000258_0000000000000000.cbm

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 27 -> /data/mogdb_b75b585a/data/db1/global/pg_dw_single

lrwx------. 1 omm dbgrp 64 Nov 23 05:11 26 -> /data/mogdb_b75b585a/data/db1/global/pg_dw

[root@mogdb tmp]# cat 14457_2.log |grep 14457|grep "pwrite64(" |awk '{print $3}'|sort|uniq

pwrite64(26,

pwrite64(74,

pwrite64(77,

[root@mogdb tmp]#

[root@mogdb tmp]# cat 14457.log |grep 14457|grep "pwrite64(" |awk '{print $3}'|sort|uniq

pwrite64(26,

pwrite64(77,

[root@mogdb tmp]# cat 14457.log |grep 14460|grep "pwrite64(" |awk '{print $3}'|sort|uniq

pwrite64(77,

pwrite64(94,

[root@mogdb tmp]# cat 14457_2.log |grep 14460|grep "pwrite64(" |awk '{print $3}'|sort|uniq

pwrite64(77,

pwrite64(96,

[root@mogdb tmp]#

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

enmotech=# SELECT OID,relname FROM pg_class where OID=16456;

oid | relname

-------+----------------

16456 | pg_toast_16453

(1 row)

看到这个 pg_toast 表还是非常奇怪,查询了相关材料发现,这是 PostgreSQL 特有的机制之一。对于 PostgreSQL 而言,页是数据在文件存储中的基本单位,默认大小为 8192 byte。同时,PostgreSQL 不允许一行数据跨页存储,那么对于超长的行数据,就会启动 TOAST,具体就是采用压缩和切片的方式。如果启用了切片,实际数据存储在另一张系统表的多个行中, 这就叫 TOAST 表,这种存储方式叫行外存储。由于 MogDB 沿用了 opengauss 内核,而 openGauss 内核又是基于 PostgreSQL 9.2.4 进化而来,因此不难看出,这仍然是用了原生 PostgreSQL 的一些机制。最后简单总结一下 pagewriter 线程的作用:1、扫描 share_buffers 中的脏页链表,获取脏页,同时将脏页写入到 double write 文件。 2、推进检查点(实际上是增量检查点).

MogDB学习笔记之 -- 了解pagewriter线程的更多相关文章

  1. 转:学习笔记: Delphi之线程类TThread

    学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...

  2. Android(java)学习笔记267:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  3. Android(java)学习笔记211:Android线程池形态

    1. 线程池简介  多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力.     假设一个服务器完成一项任务所需时间为:T1 创建线程时间, ...

  4. 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理

    1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

  5. JavaSE学习笔记(13)---线程池、Lambda表达式

    JavaSE学习笔记(13)---线程池.Lambda表达式 1.等待唤醒机制 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用 ...

  6. JavaSE学习笔记(12)---线程

    JavaSE学习笔记(12)---线程 多线程 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件在同一时刻发生(同时发生). 在操作系统中,安装了多个程序,并发指的是在 ...

  7. 操作系统学习笔记5 | 用户级线程 && 内核级线程

    在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...

  8. 学习笔记: Delphi之线程类TThread

    新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...

  9. Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  10. Java学习笔记-基础语法Ⅹ-进程线程

    学习快一个月了,现在学到了黑马Java教程的300集 打印流的特点: 只负责输出数据,不负责读取数据 有自己的特有方法 字节打印流:PrintStream,使用指定的文件名创建新的打印流 import ...

随机推荐

  1. macOS搭建SonarQube

    目录 前言 准备环境 下载安装包 解压路径:/usr/local 创建数据库 修改配置文件 配置环境变量 启动SonarQube 扫描项目 项目报告介绍 总结 前言 初到新公司,接手8-10个java ...

  2. 【Azure 微服务】记一次错误的更新Service Fabric 证书而引发的集群崩溃而只能重建

    问题描述 错误的操作步骤: 1)更新Service Fabric 的证书,制定了次要证书(Secondary),但是只修改了Service Fabric Cluster证书,而没有指定VMSS(虚拟机 ...

  3. SSRF概述

    SSRF(service side request forgery) 1.攻击的目标: 从外网无法访问的内部系统 2.形成的原因: 大部分是由服务器端提供了从其他服务器应用获取数据的功能.且没有对目标 ...

  4. linux 无法找到“/usr/bin/core_perl/gcc” vscode

    解决问题的思路 查看有没有gcc,没有安装 有的话就是,修改安装路径就可以? "/usr/bin/core_perl/gcc".修改成Gcc的绝对路径 我的修改是./usr/bin ...

  5. IntentGC-A Scalable Graph Convolution Framework Fusing Heterogeneous Information for Recommendation-KDD19

    一.摘要 网络嵌入的显著进步导致了最先进的推荐算法.然而,网站上的用户-物品交互(即显式偏好)的稀疏性仍然是预测用户行为的一个很大的挑战. 虽然,已经有研究利用了一些辅助信息(如用户间的社会关系)来解 ...

  6. BES2300方案设计开发阶段总结

    前记   从事BES芯片的方案设计已经快三年了 ,这三年,伴随着和BES的一起共同成长,我们做了不少业内大的客户.从去年年初开始接触2300方案开发,到目前为止,已经做出了不少产品.这里就说一下心得体 ...

  7. 小米Linux 运维工程师面试真题

    小米Linux 运维工程师面试真题 首先我们来看下小米 Linux 运维工程师招聘岗位要求: [岗位定义]运维工程师 [岗位薪资]10K-24K [基本要求]北京 / 经验 3-5 年 / 本科及以上 ...

  8. 聚焦“云XR如何赋能元宇宙”,3DCAT实时云渲染首届行业生态合作交流会成功举办

    2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会圆满落幕.此次活动围绕 "云XR如何 ...

  9. .NET周刊【3月第2期 2024-03-17】

    国内文章 开源.NET8.0小项目伪微服务框架(分布式.EFCore.Redis.RabbitMQ.Mysql等) https://www.cnblogs.com/aehyok/p/18058032 ...

  10. drf(路由)

    一 自动生成路由 基本使用 # 视图类,继承了ViewSetMixein,路由 # path('books/', views.BookViewSet.as_view(actions={'get': ' ...