webtet 发表于 2016-11-22 00:02:31

对PostgreSQL中bufmgr.c 中 bufs_to_lap的初步理解

  开始,在代码中加入调试信息。无关部分设省略。



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 -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]
查看完整版本: 对PostgreSQL中bufmgr.c 中 bufs_to_lap的初步理解