从源代码上理解 PostgreSQL 的 bgwriter_lru_maxpages

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

先看代码:src\backend\storage\buffer\bufmgr.c

复制代码
/*                                    
 * BgBufferSync -- Write out some dirty buffers in the pool.                                    
 *                                    
 * This is called periodically by the background writer process.                                    
 *                                    
 * Returns true if it's appropriate for the bgwriter process to go into                                    
 * low-power hibernation mode.                (This happens if the strategy clock sweep                    
 * has been "lapped" and no buffer allocations have occurred recently,                                    
 * or if the bgwriter has been effectively disabled by setting                                    
 * bgwriter_lru_maxpages to 0.)                                    
 */                                    
bool                                    
BgBufferSync(void)                                    
{                                    
    ……                                
    /*                                
     * If we're not running the LRU scan, just stop after doing the stats                                
     * stuff.  We mark the saved state invalid so that we can recover sanely                                
     * if LRU scan is turned back on later.                                
     */                                
    if (bgwriter_lru_maxpages <= 0)                                
    {                                
        saved_info_valid = false;                            
        return true;                            
    }                                
    ……                                
                                    
    /*                                
     * 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.                                
     */                                
                                    
    /* Make sure we can handle the pin inside SyncOneBuffer */                                
    ResourceOwnerEnlargeBuffers(CurrentResourceOwner);                                
                                    
    num_to_scan = bufs_to_lap;                                
    num_written = 0;                                
    reusable_buffers = reusable_buffers_est;                                
                                    
    /* Execute the LRU scan */                                
    while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est)                                
    {                                
        int            buffer_state = SyncOneBuffer(next_to_clean, true);                
                                    
        if (++next_to_clean >= NBuffers)                            
        {                            
            next_to_clean = 0;                        
            next_passes++;                        
        }                            
        num_to_scan--;                            
                                    
        if (buffer_state & BUF_WRITTEN)                            
        {                            
            reusable_buffers++;                        
            if (++num_written >= bgwriter_lru_maxpages)                        
            {                        
                BgWriterStats.m_maxwritten_clean++;                    
                break;                    
            }                        
        }                            
        else if (buffer_state & BUF_REUSABLE)                            
            reusable_buffers++;                        
    }                                
                                    
    BgWriterStats.m_buf_written_clean += num_written;                                
                                    
    ……                                
    /* Return true if OK to hibernate */                                
    return (bufs_to_lap == 0 && recent_alloc == 0);                                
}                                    
复制代码

从上述代码看出:

开宗明义,人家已经在注释中说了: This is called periodically by the background writer process.

而对于   bgwriter_lru_maxpages:

/* 
* If we're not running the LRU scan, just stop after doing the stats
* stuff. We mark the saved state invalid so that we can recover sanely
* if LRU scan is turned back on later.
*/
if (bgwriter_lru_maxpages <= 0)
{
saved_info_valid = false;
return true;
}

如果  bgwriter_lru_maxpages <=0,则立即返回。根本不进行 脏数据读写。

再看:

while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est) 
{
……

if (buffer_state & BUF_WRITTEN)
{
reusable_buffers++;
if (++num_written >= bgwriter_lru_maxpages)
{
BgWriterStats.m_maxwritten_clean++;
break;
}
}
……
}

一旦超过 bgwriter_lru_maxpages,也将停止再写入。





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

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
XML 关系型数据库 Linux
从小白到专家 PG技术大讲堂 - Part 2:PostgreSQL源代码安装
Part 2:PG源代码安装 步骤1 创建用户与环境配置 步骤2 系统内核参数配置 步骤3 PostgreSQL 安装
323 1
从小白到专家 PG技术大讲堂 - Part 2:PostgreSQL源代码安装
|
存储 SQL Oracle
源代码编译安装 MySQL 和多实例| 学习笔记
快速学习源代码编译安装 MySQL 和多实例
|
关系型数据库 C++ PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 17 章 在Windows上从源代码安装
第 17 章 在Windows上从源代码安装 目录 17.1. 使用Visual C++或Microsoft Windows SDK构建 17.1.1. 要求 17.1.2. 针对64位Windows的特殊考虑 17.1.3. 构建 17.1.4. 清理和安装 17.1.5. 运行回归测试 17.1.6. 构建文档 对于大部分用户,推荐下载Windows的二进制发布,它在PostgreSQL 的网站上作为一个图形化安装包可供下载。
1363 0
|
关系型数据库 开发工具 C++
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 17 章 在Windows上从源代码安装_17.1. 使用Visual C++或Microsoft Windows SDK构建
17.1. 使用Visual C++或Microsoft Windows SDK构建 17.1.1. 要求 17.1.2. 针对64位Windows的特殊考虑 17.1.3. 构建 17.1.4. 清理和安装 17.1.5. 运行回归测试 17.1.6. 构建文档 PostgreSQL可以使用来自微软的Visual C++编译器套件构建。
1600 0
|
关系型数据库 Unix C++
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.7. 平台相关的说明
16.7. 平台相关的说明 16.7.1. AIX 16.7.2. Cygwin 16.7.3. HP-UX 16.7.4. MinGW/原生 Windows 16.7.5. Solaris 这一节提供了考虑 PostgreSQL 安装和设置的附加平台相关的话题。
1531 0
|
关系型数据库 Unix 测试技术
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.6. 平台支持
16.6. 平台支持 如果代码包含规定要工作在一个平台(即一种 CPU 架构和操作系统的结合)上并且它最近已经被验证能在该平台上编译并通过其回归测试,PostgreSQL开发社区才会认为该平台是被支持的。
1337 0
|
关系型数据库 Unix Shell
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.5. 安装后设置
16.5. 安装后设置 16.5.1. 共享库 16.5.2. 环境变量 16.5.1. 共享库 在一些有共享库的系统里,你需要告诉你的系统如何找到新安装的共享库。那些并不是必须做这个工作的系统包括 FreeBSD、HP-UX、Linux、NetBSD、OpenBSD和Solaris。
1404 0
|
关系型数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 16 章 从源代码安装_16.3. 获取源码
16.3. 获取源码 PostgreSQL 10.1 源代码可以从我们的官方网站 https://www.postgresql.org/download/的下载区中获得。你将得到一个名为postgresql-10.1.tar.gz或postgresql-10.1.tar.bz2的文件。
1338 0
|
18天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
44 3
|
18天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
47 3