PostgreSQL Bgwriter 与 checkpoint 性能 与性能测试

2021-08-24 00:00:00 数据 测试 磁盘 写入 调整

话题的从系统性能优化讲起, 熟悉PG的同学都明白PG大部分的与硬件打交道的功能都通过LINUX来进行,如何让PG 与 LINUX 之间更协调的工作就是一个重点.


BGwrite 和 Checkpoint 之间的关系对于数据文件交换就变得有必要搞搞清楚了. 到底他们的分工是什么,之间的联系是什么.

1 checkpoint 主要的功能将内存中的脏页刷新,并且在WAL LOG中创建检查点, 通过这样的操作保证在系统crash时能进行数据回滚.

2  Bgwriter 主要的功能在于是将数据持久化将脏页写入磁盘的.


实际上这两者是合作的关系, 而这两者的合作的关系是通过 pg_stat_bgwriter 的系统表可以进行相关的展现.



1  checkpoints_timed  已经执行的预定进行checkpoint的次数

2  checkpoints_req   强行支持checkpoint 点的次数

3  checkpoint_write_time checkpoint 点时文件被写入磁盘的耗时毫秒

4  checkpoint_sync_time  checkpoint 点时文件被同步到磁盘的耗时

5  buffers_checkpoint 具体多少数据buffer通过checkpoint刷到文件

6  buffers_clean 具体多少数据buffer块通过bgwriter写入到文件

7  maxwritten_clean 是反映多少次bgwriter_lru_maxpages 在充满的状态下,不在进行刷新的操作次数


8  buffers_backend buffers 被直接写入到后台的次数

9  buffers_backend_fsync 后台被动调用fsync 来进行相关的磁盘写入

10 buffers_alloc  分配的缓冲区数

11 stats_reset  统计数据更新的时间


实际上这个视图反馈了后台写入磁盘的信息,实际上PG有两个和写入数据打交道的子系统, background writer 和 checkpointer,  目的只有一个就是将共享缓冲区的信息刷入到磁盘中,实际上checkpointer 主要针对的是wal log 打点的信息定时要进行相关操作, background writer 是一个固定的长时间的工作,主要将缓冲区的数据刷入到磁盘中. 


通过这个视图可以观察到两个问题

1  checkpoints的质量

2  bgwriter settings


关于checkpoint点的执行次数,以及对比具体多少数据通过 checkpoint进行刷新可以查看到checkpoint 的参数设置与具体的日志量进行对比,获得当前的系统的checkpoint 性能状态. 


通过对比buffers_clean来了解bgwrite写入数据的情况, 通过buffers_backend buffers 将信息与后端进行同步.



这里有牵扯两个问题,checkpoint为什么会工作, 1 超时 2 写入的wal过多导致触发checkpoint机制, 所以当你频繁遇到2 的时候,那么说明你需要调整参数,或者购买一个更快的磁盘系统, 在或者需要关注一下你的业务量和业务的程序逻辑设计了. 


其中涉及的参数


bgwriter_delay

bgwriter_lru_maxpages

bgwriter_lru_multiplier

max_wal_size

checkpoint_completion_target



下面我们就测试一下看看调整这些参数对于一个POSTGRESQL 系统有什么影响.


下面开始测试的环节,测试机是一台虚拟机 4 核心  16G 的CPU 

系统没有进行复杂的优化,仅仅对 share buffer, workmem 进行了例行的调整




pgbench -i -s 1000     创建一个亿的数据



以下为基准测试测试后的数据

 pgbench -M prepared -v -r -P 1 -f ./readwrite.sql -c 32 -j 32 -T 120 -D scale=1000 -D range=10000000


测试读写脚本

\set aid random_gaussian(1, :range, 10.0)

\set bid random(1, 1 * :scale)

\set tid random(1, 10 * :scale)

\set delta random(-5000, 5000)

BEGIN;

UPDATE pgbench_accounts SET abalance = abalance + :delta WHERE aid = :aid;

SELECT abalance FROM pgbench_accounts WHERE aid = :aid;

UPDATE pgbench_tellers SET tbalance = tbalance + :delta WHERE tid = :tid;

UPDATE pgbench_branches SET bbalance = bbalance + :delta WHERE bid = :bid;

INSERT INTO pgbench_history (tid, bid, aid, delta, mtime) VALUES (:tid, :bid, :aid, :delta, CURRENT_TIMESTAMP);

END;



分数为6689


在调整了,checkpoint的三个参数后,测试的结果有了变化, 分数变为6812


6812 - 6689= 123 分



我们继续调整 bgwriter_delay,  bgwriter_lru_maxpages  , bgwriter_lru_mulitiplier 等参数, 希望 bgwriter 能提高刷新的数据的能力提高分数




经过多次测试后,分数并没有提高而是从6812 降低到 6604 , 将参数还原到原来初始的设定,分数由 6604 提高到 6755



从测试中可以看出,调整checkpoint 在pgbench得到的分数的提升,比较明显,而调整bgwriter 后对于测试的分数的增长并不明显.



相关文章