共计 2811 个字符,预计需要花费 8 分钟才能阅读完成。
这篇文章主要讲解了“怎么使用 Postgresql 的 Checkpoint”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“怎么使用 Postgresql 的 Checkpoint”吧!
Checkpoint 是什么?
checkpoint 又名检查点,一般 checkpoint 会将某个时间点之前的 dirty data 全部写出到磁盘,以实现数据的一致性与完整性。目前各个流行的关系型数据库都具备 checkpoint 功能,其主要目的是为了缩短 crash recovery time,以 Oracle 为例,在进行数据恢复时,会以最近的 checkpoint 为参考点执行事务 roll forward,然后对没有 commit 的事务进行 roll back。而在 WAL 机制的浅析中,也提过 PostgreSQL 在崩溃恢复时会以最近的 checkpoint 为基础,不断应用这之后的 WAL 日志。机制大致相同。
PG 的检查点种类:
在 xlog.h 文件中,有如下代码对 checkpoint 进行了相应的分类:
/*
* OR-able request flag bits for checkpoints. The cause bits are used only
* for logging purposes. Note: the flags must be defined so that it s
* sensible to OR together request flags arising from different requestors.
*/
/* These directly affect the behavior of CreateCheckPoint and subsidiaries */
#define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */
#define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint,
* but issued at end of WAL
* recovery */
#define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */
#define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */
/* These are important to RequestCheckpoint */
#define CHECKPOINT_WAIT 0x0010 /* Wait for completion */
/* These indicate the cause of a checkpoint request */
#define CHECKPOINT_CAUSE_XLOG 0x0020 /* XLOG consumption */
#define CHECKPOINT_CAUSE_TIME 0x0040 /* Elapsed time */
#define CHECKPOINT_FLUSH_ALL 0x0080 /* Flush all pages, including those
也就是说,以下几种情况会触发数据库操作系统做检查点操作:
数据库 shutdown
数据库 recovery 完成
超级用户 (其他用户不可) 执行 CHECKPOINT 命令
XLOG 日志量达到了触发 checkpoint 阈值
周期性地进行 checkpoint
触发 checkpoint 时,需要刷新所有脏页,为了能够周期性的创建检查点,减少崩溃恢复时间,同时合并 I /O,PostgreSQL 提供了辅助进程 checkpointer。它会周期性检测时间以及上面的 XLOG 日志量阈值是否达到,而周期时间以及 XLOG 日志量阈值可以通过参数来设置大小,接下来介绍下与 checkpoints 相关的参数。
checkpoints 相关的参数
checkpoint_segments
当前最大的 WAL 日志文件段的数量,或者说,当系统的日志量达到这么多的时触发一个检查点,其缺省值为 3,每个段的大小是 16M,因此大概 64M 日志触发一个检查点。调大这个数将延长系统崩溃后恢复的时间。
checkpoint_timeout
系统自动执行 checkpoint 之间的最大时间间隔。系统默认值是 5 分钟。
checkpoint_completion_target
手册上原文为“Specifies the target of checkpoint completion, asa fraction of total time between checkpoints”,完成检查点所需要的时间 / 检查点之间总时间的目标比例 *100%,它要求系统在恰当的时间内完成检查点,不要太快也不要太慢,过快将导致过于密集的 IO, 形成 IO 风暴影响系统的平稳运行,过慢则可能引发持续性的 IO, 降低系统性能。
checkpoint_warning
系统默认值是 30 秒,如果 checkpoints 的实际发生间隔小于该参数,将会在 server log 中写入写入一条相关信息。可以通过设置为禁用。
checkpoint 相关的计算:
checkpoint_completion_target 对计算起着决定性的作用
假如参数这样配置:
shared_buffers = 128GB # 1/4 内存
checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 – 1.0
checkpoint_timeout = 30min
max_wal_size = 256GB # 2*shared_buffers
min_wal_size = 64GB # shared_buffers * 1/2
1:极端假设 128G 全是脏数据
(128*1024)/(30*60*0.9)= 80.90864198 MB/s
要求磁盘的平均离散 IO 至少在这个之上,否则存在瓶颈,因为触发时刻,压力更大。
当然前提假设,128G 都是脏的,如果脏数据不多,压力更小
2:假设周期内产生 256G 的 WAL
那么
(256*1024)/ (30*60)= 145.6355556 MB/s
WAL 为顺序 IO
3:bgWriter
业务上写操作除了产生 WAL,还有 bgwriter 周期性地写出脏块,因为一个块可能被多次修改,但是 writer 此时可能更少
(256*1024)/ (30*60)= 145.6355556 MB/s
综上,数据库写操作吞吐均值可能是 80.9 MB/s + 145.6 MB/s+ 145.6 MB/s=372MB/s
出发瞬间的压力可能超过此值。
感谢各位的阅读,以上就是“怎么使用 Postgresql 的 Checkpoint”的内容了,经过本文的学习后,相信大家对怎么使用 Postgresql 的 Checkpoint 这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!