前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL Bgwriter 与 checkpoint 性能 与性能测试

PostgreSQL Bgwriter 与 checkpoint 性能 与性能测试

作者头像
AustinDatabases
发布2021-09-24 17:47:31
1.5K0
发布2021-09-24 17:47:31
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

话题的从系统性能优化讲起, 熟悉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 后对于测试的分数的增长并不明显.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档