首页 > 其他分享 >MogDB学习笔记之 -- 了解pagewriter线程

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

时间:2024-03-30 15:25:23浏览次数:18  
标签:Process 00 pagewriter 05 -- 14421 MogDB omm strace

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、推进检查点(实际上是增量检查点).

标签:Process,00,pagewriter,05,--,14421,MogDB,omm,strace
From: https://www.cnblogs.com/helloopenGauss/p/18105525

相关文章

  • Python+selenium+chromedriver实现自动化爬虫(一)安装
    Python+selenium+chromedriver实现自动化爬虫(一)安装一、概述1.python作为程序语言2.selenium作为库函数3.chromedriver.exe作为调用的可执行程序二、安装(一)Python安装(二)selenium安装安装好python后,使用pipinstallselenium安装好selenium库函数,其中pip安装换源及更新......
  • 鱼塘钓鱼问题
    这题目给了三种做法,两种是动态规划做法,一种是贪心加枚举,还有一种是堆写法,这可以促进我对动态规划的理解,所以在此贴出四种板子,并且给出解释第一种做法,自下二上更新第二种做法,自上而下更新点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=110;int......
  • Acwing 1050. 鸣人的影分身
    https://www.acwing.com/problem/content/1052/输入样例:173输出样例:8#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<int,int>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3f3f;constLLN=200200,M=2020;LLn,m;LL......
  • MySQL 事务的两阶段提交--转
    什么是事务事务是数据库中一组原子性的操作,要么全部成功,要么全部失败。事务具有四个特性,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),简称ACID。在MySQL中,我们可以使用 begin 或 starttransaction 命令开启一个事务,使用 commit 命令提交......
  • 线性回归从零开始(麻雀虽小五脏俱全)
    目录构造数据集初始化模型参数定义模型定义损失函数定义优化算法训练过程线性回归是一个很好能理解深度学习的模型,麻雀虽小五脏俱全。构造数据集defsynthetic_data(w,b,num_examples):X=torch.normal(0,1,(num_examples,len(w)))y=torch.matmul(X,w)+by......
  • JoinPoint 常用的方法
    Object[]getArgs:返回目标方法的参数SignaturegetSignature:返回目标方法的签名ObjectgetTarget:返回被织入增强处理的目标对象ObjectgetThis:返回AOP框架为目标对象生成的代理对象*JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象......
  • python str.split和rsplit笔记
    点击查看代码"""rsplit和split方法演示str.split(sep=None,maxsplit=-1)str.rsplit(sep=None,maxsplit=-1)"""#不指定sep或sep为None,拆分空字符串或只包含空格的字符串,返回为[](空列表)#1.空字符串str_1=''li_1_1=str_1.split()li_1_2=str_1.split(sep=None......
  • 渗透项目1-GoldenEye
    靶机地址:https://www.vulnhub.com/entry/goldeneye-1,240/靶机难度:中等(CTF)目标:得到root权限&找到flag.txt信息收集收集目标iparp-scan-l(收集本地网络中的活跃主机的IP地址和MAC地址。)kaliarp-scan网络扫描工具扫描局域网ip地址-阿里云开发者社区(aliyun.com)......
  • Rust简易入门(一)
    Rust!Rust!Rust!变量与不可变性在Rust中,变量使用let关键字进行声明Rust支持类型推导,也可以显示指定变量类型变量名采用蛇形命名法,枚举结构体采用帕斯卡命名法,没有使用的变量采用前置下划线_以消除警告强制类型转换关键词as打印变量println!("val:{}",x);print......
  • 存储器
    存储器分为寄存器Cache(高速缓冲存储器)主存储器辅存储器从下到上,速度越来越快,容量越来越小,成本越来越高 存储器的读取方式存取方式读/写装置数据块标志访问特性代表顺序存取共享读/写装置无特定线性顺序磁带直接存取......