设为首页 收藏本站
查看: 1033|回复: 0

[经验分享] 对PostgreSQL中bufmgr.c 中 bufs_to_lap的初步理解

[复制链接]

尚未签到

发表于 2016-11-22 00:02:31 | 显示全部楼层 |阅读模式
  开始,在代码中加入调试信息。无关部分设省略。



bool                                
BgBufferSync(void)                                
{                                
……                                                            
    int            bufs_to_lap;               
……                           
if (saved_info_valid)                           
{
        //added by gaojian
        fprintf(stderr,"saved_info_valid true\n");
int32        passes_delta = strategy_passes - prev_strategy_passes;                                        strategy_delta = strategy_buf_id - prev_strategy_buf_id;                        
strategy_delta += (long) passes_delta *NBuffers;   
        ......                     
        if ((int32) (next_passes - strategy_passes) > 0)                        
{                        
            fprintf(stderr,"next_pass > strategy_passes.\n");
/* we're one pass ahead of the strategy point */                    
bufs_to_lap = strategy_buf_id - next_to_clean;                    
……                    
}                        
else if (next_passes == strategy_passes &&                        
next_to_clean >= strategy_buf_id)               
{
            fprintf(stderr,"next_passes == strategy_passes.\n");                        
/* on same pass, but ahead or at least not behind */                    
bufs_to_lap = NBuffers - (next_to_clean - strategy_buf_id);                    
……                    
}                        
else                        
{                        
fprintf(stderr,"we are behind.\n");
            /*                    
* We're behind, so skip forward to the strategy point and start                    
* cleaning from there.                    
*/                    
next_to_clean = strategy_buf_id;                    
next_passes = strategy_passes;                    
bufs_to_lap = NBuffers;                    
……                    
}                 
}                           
else                           
{  
        fprintf(stderr,"saved_info_valid false\n");                          
……                        
bufs_to_lap = NBuffers;                        
}                           
……                           
    bufs_ahead = NBuffers - bufs_to_lap;                           
……                           
    num_to_scan = bufs_to_lap;
    ......                           
    /* Execute the LRU scan */                           
while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est)                           
{                           
//added by gaojian                        
fprintf(stderr,"num_to_scan is: %d \n",num_to_scan);                        
int    buffer_state = SyncOneBuffer(next_to_clean, true);                    
if (++next_to_clean >= NBuffers)                        
{                        
next_to_clean = 0;           
elog(INFO,"------------------next_passes++.\n");                    
next_passes++;                    
}                        
num_to_scan--;                        
……                        
}                           
    ……                           
new_strategy_delta = bufs_to_lap - num_to_scan;                           
new_recent_alloc = reusable_buffers - reusable_buffers_est;                           
if (new_strategy_delta > 0 && new_recent_alloc > 0)                           
{                           
scans_per_alloc = (float) new_strategy_delta / (float) new_recent_alloc;                        
smoothed_density += (scans_per_alloc - smoothed_density) /                        
smoothing_samples;                    
……                        
}
    ......                           
}                                
  运行的结果会如何呢?



[postgres@localhost bin]$ ./postgres -D /usr/local/pgsql/data
LOG:  database system was shut down at 2012-11-02 13:51:46 CST
saved_info_valid false.
LOG:  autovacuum launcher started
LOG:  database system is ready to accept connections
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
......
  也就是说,一开始  saved_info_valid 是 false, 后来经过一次运行后,其值才发生转变,变成 true。
  而之后, next_passes == startegy_passes  (其实,一开始都是零)
  结束

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303479-1-1.html 上篇帖子: 可以在mono下运行的一个ajax web小程序,使用PostgreSQL作为数据库(期待MonoDevelop 2.0) 下篇帖子: Postgresql:数据目录、配置文件、pid文件的位置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表