PostgreSQL启动过程中的那些事十八:bgwriter进程一

       话说main()->PostmasterMain()->StartupDataBase(),fork了启动进程调用,调用StartupXLOG方法,启动XLOG、验证数据库一致性、根据情况做数据库恢复和创建检查点,然后启动进程退出。Postmaster进程响应启动进程退出信号,启动了后台写进程、WAL日志写进程、AUTOVACUUM进程、归档进程、统计进程这些辅助进程。

 

1

 

 StartupDataBase调用流程略图

 

         这几个进程都调用自己相应的函数,组织不同入参,然后调用postmaster_forkexec函数,创建一个进程,根据不同的入参在SubPostmasterMain函数里走了不同的分支。

       这一节讨论后台写进程bgwriter的启动过程,其是在Postgres8.0里新加的。

       在需要释放共享缓存以读入其他页面时,后台写进程(bgwriter)写出脏共享缓存数据(shared buffer)。在最好情况下所有从共享缓存里往外写将由后台写进程(bgwriter)发起。但是,如果后台写进程(bgwriter)没能维护足够多的干净共享缓存,其它后台进程仍然有权发起写脏共享缓存数据。

        后台写进程(bgwriter)还负责处理所有检查点(checkpoint)。在从上次以来定量时间之后他将自动分派检查点,且后台写进程(bgwriter)也能够被发信号执行被请求的检查点。(每当很多WAL段被使用,后台进程填满WAL段时,通过后台进程信号通知后台写进程(bgwriter), GUC参数安排/委任一个检查点;后台写进程(bgwriter)自己不查看条件。)

        后台写进程(bgwriter)由postmaster进程在启动子进程(startup process)一结束就启动,或者如果我们正在做归档回复,恢复进程一开始就启动。他一起存活到postmaster命令他结束。通常结束后台写进程(bgwriter)是通过SIGUSR2信号,且指示后台写进程(bgwriter)执行一个关闭检查点(shutdown checkpoint)并退出(exit(0))。(在SIGUSR2信号发起之前所有backend进程必须被停止!)紧急结束通过信号SIGQUIT;和任何后台进程(backend)一样,后台写进程(bgwriter)将简单退出且在SIGQUIT信号上退出。

        如果后台写进程(bgwriter)非预期退出,postmaster进程象处理backend进程崩溃一样处理:共享内存可能被破坏,因此现有的backend进程应该通过SIGQUIT信号被杀掉而且后面启动一个恢复周期。(甚至如果共享内存没有被破坏,pg丢失了下一个检查点哪些文件需要同步的信息,因此需要强制做一个系统重启。)

         pg有三个GUC参数:bgwriter_delay(默认200毫秒)、bgwriter_lru_maxpages(默认100)、bgwriter_lru_multiplier(默认2.0)。系统每个bgwriter_delay时间唤醒bgwriter,扫描LRU链表,最多写出N×bgwriter_lru_multiplier且不超过bgwriter_lru_maxpages个脏缓冲页,N是最近两次运行bgwriter期间系统申请的缓冲页数。如果Bgwriter频繁写经常更新的页会增加I/O次数而性能下降,但如果bgwriter间隔很长时间才写,又不能优化I/O,这个需要根据实际情况权衡。

 

2

       Bgwriter进程启动后的调用流程图如下:

 

 

bgwriter进程的调用流程略图

 

在启动进程里Main()->SubPostmasterMain(),调用了如下方法,启动XLOG后就结束了生命。

1)MemoryContextInt方法,参见《PostgresQL启动过程中的那些事一》;

2)InitializeGUCOptions方法,参见《PostgresQL启动过程中的那些事三》;

3)Read_backend_variablases方法,为重组BackendParameters结构读取前面存储的文件pgsql_tmp/pgsql_tmp.backend_var.[pid].[tmpFileNum];

4)PGSharedMemoryReAttach方法,attach进程postmaster里的共享内存;

5)read_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值