對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@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  (其實,一開始都是零)

結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM