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

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介:

开始

把BgBufferSync 的代码内容简略化,得到:

复制代码
bool                    
BgBufferSync(void)                    
{                    
    ……                
                    
    /* Used to compute how far we scan ahead */                
    long        strategy_delta;        
    int            bufs_to_lap;    
    ……                
    /* Variables for the scanning loop proper */                
    int            num_to_scan;    
    int            num_written;    
    int            reusable_buffers;    
    ……                
    if (saved_info_valid)                
    {                
        ……            
                    
        if ((int32) (next_passes - strategy_passes) > 0)            
        {            
                    
            /* 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)    
        {            
                    
            /* on same pass, but ahead or at least not behind */        
            bufs_to_lap = NBuffers - (next_to_clean - strategy_buf_id);        
            ……        
        }            
        else            
        {            
            ……        
            bufs_to_lap = NBuffers;        
        }            
                    
    }                
    else                
    {                
        ……            
        bufs_to_lap = NBuffers;            
    }                
    ……                
                    
    /*                
     * Now write out dirty reusable buffers, working forward from the                
     * next_to_clean point, until we have lapped the strategy scan, or cleaned                
     * enough buffers to match our estimate of the next cycle's allocation                
     * requirements, or hit the bgwriter_lru_maxpages limit.                
     */                
                    
    ……                
    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--;            
        ……            
    }                
                    
    ……                
    /* Return true if OK to hibernate */                
    return (bufs_to_lap == 0 && recent_alloc == 0);                
}                    
复制代码

一开始的时候,bufs_to_lap =4096, 就是 4096*8K=32MB ,相当于 Shared_buffers 的数量。

然后如果对代码进行跟踪,可以发现 bufs_to_lap 一开始就是 4096,然后逐次减1。






本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/11/02/2750961.html,如需转载请自行联系原作者

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
关系型数据库 分布式数据库 PolarDB
|
关系型数据库 分布式数据库 定位技术
PolarDB for PostgreSQL 开源必读手册-VACUUM处理(中)
PolarDB for PostgreSQL 开源必读手册-VACUUM处理
174 0
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
378 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
432 0
|
存储 算法 安全
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(下)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
394 0
|
关系型数据库 分布式数据库 开发工具
|
存储 关系型数据库 Linux
PolarDB for PostgreSQL 开源必读手册-PolarDB安装与配置(下)
PolarDB for PostgreSQL 开源必读手册-PolarDB安装与配置
727 0