checkpoint中用于控制刷盘频率的函数是什么

53次阅读
没有评论

共计 3866 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要介绍“checkpoint 中用于控制刷盘频率的函数是什么”,在日常操作中,相信很多人在 checkpoint 中用于控制刷盘频率的函数是什么问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”checkpoint 中用于控制刷盘频率的函数是什么”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

一、数据结构

宏定义
checkpoints request flag bits
checkpoints request flag bits, 检查点请求标记位定义.

/*
 * 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 */
#define CHECKPOINT_FLUSH_ALL 0x0010 /* Flush all pages, including those
 * belonging to unlogged tables */
/* These are important to RequestCheckpoint */
#define CHECKPOINT_WAIT 0x0020 /* Wait for completion */
#define CHECKPOINT_REQUESTED 0x0040 /* Checkpoint request has been made */
/* These indicate the cause of a checkpoint request */
#define CHECKPOINT_CAUSE_XLOG 0x0080 /* XLOG consumption */
#define CHECKPOINT_CAUSE_TIME 0x0100 /* Elapsed time */

WRITES_PER_ABSORB

/* interval for calling AbsorbSyncRequests in CheckpointWriteDelay */
// 调用 AbsorbSyncRequests 的间隔, 默认值为 1000
#define WRITES_PER_ABSORB 1000

二、源码解读

CheckpointWriteDelay
CheckpointWriteDelay, 控制 checkpoint 的频率, 逻辑不复杂, 判断 checkpoint flags 非 CHECKPOINT_IMMEDIATE/ 非 shutdown_requested/ 非 CHECKPOINT_IMMEDIATE 并且 checkpoint 处于调度中, 如满足上述条件, 则调用 AbsorbSyncRequests 处理 sync, 休眠 100ms; 不如满足上述条件, 则 absorb_counter 计数器减一, 如计数器≤0, 则调用 AbsorbSyncRequests 处理 sync.

/*
 * CheckpointWriteDelay -- control rate of checkpoint
 *  控制 checkpoint 的频率
 *
 * This function is called after each page write performed by BufferSync().
 * It is responsible for throttling BufferSync() s write rate to hit
 * checkpoint_completion_target.
 *
 * The checkpoint request flags should be passed in; currently the only one
 * examined is CHECKPOINT_IMMEDIATE, which disables delays between writes.
 *
 *  progress  is an estimate of how much of the work has been done, as a
 * fraction between 0.0 meaning none, and 1.0 meaning all done.
 */
CheckpointWriteDelay(int flags, double progress)
 static int absorb_counter = WRITES_PER_ABSORB;
 /* Do nothing if checkpoint is being executed by non-checkpointer process */
 if (!AmCheckpointerProcess())
 return;
 /*
 * Perform the usual duties and take a nap, unless we re behind schedule,
 * in which case we just try to catch up as quickly as possible.
 */
 if (!(flags   CHECKPOINT_IMMEDIATE)  // 非 CHECKPOINT_IMMEDIATE
 !shutdown_requested  // 非关闭请求
 !ImmediateCheckpointRequested()  // 非 CHECKPOINT_IMMEDIATE
 IsCheckpointOnSchedule(progress))// 处于 checkpoint 调度中
 { if (got_SIGHUP)
 {
 got_SIGHUP = false;
 ProcessConfigFile(PGC_SIGHUP);
 /* update shmem copies of config variables */
 UpdateSharedMemoryConfig();
 }
 //Absorb 吸收 (处理) 同步请求
 AbsorbSyncRequests();
 // 重置为 WRITES_PER_ABSORB(1000)
 absorb_counter = WRITES_PER_ABSORB;
 // 检查归档是否超时
 CheckArchiveTimeout();
 /*
 * Report interim activity statistics to the stats collector.
 */
 // 统计信息
 pgstat_send_bgwriter();
 /*
 * This sleep used to be connected to bgwriter_delay, typically 200ms.
 * That resulted in more frequent wakeups if not much work to do.
 * Checkpointer and bgwriter are no longer related so take the Big
 * Sleep.
 */
 // 休眠 100ms
 pg_usleep(100000L);
 }
 else if (--absorb_counter  = 0)//Absorb 计数器减一
 {
 // 如计数器小于等于 0
 /*
 * Absorb pending fsync requests after each WRITES_PER_ABSORB write
 * operations even when we don t sleep, to prevent overflow of the
 * fsync request queue.
 */
 //Absorb 同步请求
 AbsorbSyncRequests();
 // 重置计数器
 absorb_counter = WRITES_PER_ABSORB;
 }
}

到此,关于“checkpoint 中用于控制刷盘频率的函数是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计3866字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)