• 对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  (其实,一开始都是零)

    结束

  • 相关阅读:
    gehealthcare
    访问 WebBrowser 中的 js 变量和 JSON 数据 IEBrowser [2]
    在 WebBrowser 的任意页面中安装 jQuery 操作页面元素 IEBrowser [4]
    .NET 服务器按钮控件轻松调用 Ajax JQueryElement [2]
    使 WebBrowser 更简单的新加和执行 js, 可安装 jQuery 脚本的 C# 开源代码 IEBrowser [1]
    在 WebBrowser 中通过 js 访问 .NET 类, 完成用户注册 IEBrowser [3]
    .NET 下的 jQuery UI 开源控件 JQueryElement, 简化 js 脚本编写, 提供更方便的 ajax 调用[1]
    在 .NET 中设置页面元素的 javascript 事件 IEBrowser [5]
    地图切片总结110916
    ArcGIS for silverlight 中 QueryTask查询结果限制(500)问题[转]
  • 原文地址:https://www.cnblogs.com/gaojian/p/2751104.html
Copyright © 2020-2023  润新知