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