PostgreSQL中checkpoint的作用和工作原理
###checkpoint的作用
将脏页写入磁盘,避免数据库实例重启之后需要从WAL中恢复大量的数据而增加数据库恢复时间
###checkpoints的触发时机
1,手动CHECKPOINT命令;
2,pg_basebackup,CREATE DATABASE,或pg_ctl stop|restart;
3,定期执行的checkpoint,也即每隔checkpoint_timeout定时执行的,默认值为300秒
4,自上一个检查点以来生成了已配置的最大WAL文件数量,属于被动checkpoint。
###checkpoint触发时的执行步骤
1,识别共享缓冲区中的所有脏页(已修改的页);
2,将所有这些缓冲区写入磁盘(或更确切地说,写入文件系统缓存);
3,调用fsync()将所有修改后的文件刷新到磁盘(数据文件)。
###checkpoint的执行时间参数
checkpoint执行时主要是物理IO操作,这是一个比较耗时的操作,PostgreSQL尽可能在checkpoint_timeout*checkpoint_completion_target这个时间范围内完成物理IO操作。
也就是说,只要在规定的时间内完成本次物理IO操作即可,checkpoint_completion_target是一个介于0到1的一个比例,默认值是0.5,那么在 checkpoint 操作的前 50% 时间内,PostgreSQL 会尽量将缓冲区的脏页写入磁盘,这样避免了在 checkpoint 结束时产生突发的 I/O 高峰。
checkpoint相关的系统表字段的含义,来自于:https://www.cnblogs.com/abclife/p/14573514.html
=#select * from pg_stat_bgwriter; -[ RECORD 1 ]---------+----------------------------- checkpoints_timed | 15462 #计划检查点的发生次数,这种检查点是checkpoint_timeout参数规定的超时达到后系统启动的checkpoint; checkpoints_req | 148 #被动checkpoint,非计划检查点的次数,包含手动的检查点、xlog(redo日志)检查点(指当某些数据库预定的阈值达到时启动的检查点,比如WAL已经超出了max_wal_size或者checkpoint_segments,也会触发xlog ckpt) checkpoint_write_time | 2130524730 #检查点写入的总时长 checkpoint_sync_time | 72082 #检查点同步文件的总时长 buffers_checkpoint | 174657791 #检查点清理的脏块 buffers_clean | 0 #bgwriter清理的脏块数量 maxwritten_clean | 0 #bgwriter清理脏块的时候达到bgwriter_lru_maxpages后终止写入批处理的次数,为了防止一次批量写入太大影响数据块IO性能,bgwriter每次都有写入的限制。不过这个参数的缺省值100太小,对于负载较高的数据库,需要加大; buffers_backend | 24491898 #backend清理的脏块数量 buffers_backend_fsync | 2 #backend被迫自己调用fsync来同步数据的计数,如果这个计数器不为零,说明当时的fsync队列已经满了,存储子系统肯定出现了性能问题; buffers_alloc | 51275374 #buffer分配的次数 stats_reset | 2021-01-29 14:41:48.97647+08 #上一次RESET这些统计值的时间 =#
参考:
https://guobo507.github.io/2020/basic-tuning-of-checkpoint/
https://www.cnblogs.com/abclife/p/14573514.html
https://cloud.tencent.com.cn/developer/article/1882199