本文介绍了checkpoint_completion_target参数对checkpoint调度的影响.PostgreSQL对checkpoint过程的调度,与数据库在运行过程中产生日志的大小和时间两个维度相关.
日志
PostgreSQL源码中CalculateCheckpointSegments和IsCheckpointOnSchedule函数给出了checkpoint_completion_target参数对checkpoint调度的影响,在给出计算公式前,先行定义几个变量:
checkpoint进度progress:
progress=(num_processed / num_to_scan)
其中:
1.num_processed已处理的脏块数
2.num_to_scan总共需要处理的块数
checkpoint启动后产生的日志相对允许最大日志量的比例:
elapsed_xlogs = elapsed_xlogsize/wal_segment_size/checkpoint_segments
checkpoint_segments = max_wal_size_mb/wal_segment_size/(1.0 + checkpoint_completion_target)
其中:
1.elapsed_xlogsize是指在checkpoint启动后产生的日志量(以MB为单位)
2.wal_segment_size默认为16MB
3.max_wal_size_mb是postgresql.conf配置文件中
在满足以下条件时:
progress*checkpoint_completion_target ≥ elapsed_xlogs
在checkpointer进程会进行一定时间的休眠(100ms),以控制脏块刷盘(包括fsync)的进度.
可以看出,上述条件的临界点是:
progress*checkpoint_completion_target = elapsed_xlogs
现就此临界点对该公式进行变换,让checkpoint_completion_target放在等式的右边:
(num_processed / num_to_scan)*checkpoint_completion_target =
elapsed_xlogsize*(1.0 + checkpoint_completion_target)/max_wal_size_mb
-->
num_processed / num_to_scan =
elapsed_xlogsize*(1.0/checkpoint_completion_target + 1)/max_wal_size_mb
由此可见,在其他变量一定的情况下,右边算式的值与checkpoint_completion_target成反比,checkpoint_completion_target越大该值越小,意味着checkpointer进程休眠的机会越多.
时间
设elapsed_seconds=(now.tv_sec - ckpt_start_time + now.tv_usec / 1000000.0)表示过去消逝的时间
满足以下条件,checkpointer进度可休眠:
(num_processed/num_to_scan)*checkpoint_completion_target ≥ elapsed_seconds / checkpoint_timeout
-->
num_processed/num_to_scan ≥ elapsed_seconds/(checkpoint_completion_target*checkpoint_timeout)
右边表达式在其他变量一定的情况下,checkpoint_completion_target越大,则值越小,checkpointer可休眠的机会越大.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-2652315/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/6906/viewspace-2652315/