PostgreSQL 源码解读(214)- 后台进程#13(checkpointer-IsCheckpointOnSchedule)
短信预约 -IT技能 免费直播动态提醒
本节介绍了checkpoint中用于控制checkpoint刷盘频率的函数:IsCheckpointOnSchedule.
一、数据结构
宏定义
checkpoints request flag bits
checkpoints request flag bits,检查点请求标记位定义.
#define CHECKPOINT_IS_SHUTDOWN 0x0001
#define CHECKPOINT_END_OF_RECOVERY 0x0002
#define CHECKPOINT_IMMEDIATE 0x0004
#define CHECKPOINT_FORCE 0x0008
#define CHECKPOINT_FLUSH_ALL 0x0010
#define CHECKPOINT_WAIT 0x0020
#define CHECKPOINT_REQUESTED 0x0040
#define CHECKPOINT_CAUSE_XLOG 0x0080
#define CHECKPOINT_CAUSE_TIME 0x0100
WRITES_PER_ABSORB
//调用AbsorbSyncRequests的间隔,默认值为1000
#define WRITES_PER_ABSORB 1000
二、源码解读
IsCheckpointOnSchedule
该函数判断是否在完成checkpoint的调度中,如返回T则可以休息,否则返回F则需要干活.
static void
CalculateCheckpointSegments(void)
{
double target;
//#define ConvertToXSegs(x,segsize) (x / ((segsize) / (1024 * 1024)))
target = (double) ConvertToXSegs(max_wal_size_mb, wal_segment_size) /
(1.0 + CheckPointCompletionTarget);
CheckPointSegments = (int) target;
if (CheckPointSegments < 1)
CheckPointSegments = 1;
}
static bool
IsCheckpointOnSchedule(double progress)
{
XLogRecPtr recptr;
struct timeval now;
double elapsed_xlogs,
elapsed_time;
Assert(ckpt_active);
//实际进度调整为progress*checkpoint_completion_target
progress *= CheckPointCompletionTarget;
if (progress < ckpt_cached_elapsed)
return false;
if (RecoveryInProgress())
recptr = GetXLogReplayRecPtr(NULL);
else
recptr = GetInsertRecPtr();
elapsed_xlogs = (((double) (recptr - ckpt_start_recptr)) /
wal_segment_size) / CheckPointSegments;
if (progress < elapsed_xlogs)
{
//进度小于产生xlogs的速度,需干活
ckpt_cached_elapsed = elapsed_xlogs;
return false;
}
gettimeofday(&now, NULL);
elapsed_time = ((double) ((pg_time_t) now.tv_sec - ckpt_start_time) +
now.tv_usec / 1000000.0) / CheckPointTimeout;
if (progress < elapsed_time)
{
//进度慢于消逝的时间,需干活
ckpt_cached_elapsed = elapsed_time;
return false;
}
//处于调度中,可以休息
return true;
}
三、跟踪分析
N/A
四、参考资料
PG Source Code
PgSQL · 特性分析 · 谈谈checkpoint的调度
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
PostgreSQL 源码解读(214)- 后台进程#13(checkpointer-IsCheckpointOnSchedule)
下载Word文档到电脑,方便收藏和打印~
下载Word文档