我的编程空间,编程开发者的网络收藏夹
学习永远不晚

PostgreSQL 源码解读(214)- 后台进程#13(checkpointer-IsCheckpointOnSchedule)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

PostgreSQL 源码解读(214)- 后台进程#13(checkpointer-IsCheckpointOnSchedule)

本节介绍了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文档

编程热搜

目录