PostgreSQL wal_buffers 自动计算算法

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , wal_buffers , shared_buffers


背景

当wal_buffers设置为-1时,PG会自动计算一个值,取决于几个因素,wal_segment_size, shared_buffer.

算法

src/backend/access/transam/xlog.c

/*  
 * GUC check_hook for wal_buffers  
 */  
bool  
check_wal_buffers(int *newval, void **extra, GucSource source)  
{  
        /*  
         * -1 indicates a request for auto-tune.  
         */  
        if (*newval == -1)  
        {  
                /*  
                 * If we haven't yet changed the boot_val default of -1, just let it  
                 * be.  We'll fix it when XLOGShmemSize is called.  
                 */  
                if (XLOGbuffers == -1)  
                        return true;  
  
                /* Otherwise, substitute the auto-tune value */  
                *newval = XLOGChooseNumBuffers();  
        }  
  
        /*  
         * We clamp manually-set values to at least 4 blocks.  Prior to PostgreSQL  
         * 9.1, a minimum of 4 was enforced by guc.c, but since that is no longer  
         * the case, we just silently treat such values as a request for the  
         * minimum.  (We could throw an error instead, but that doesn't seem very  
         * helpful.)  
         */  
        if (*newval < 4)  
                *newval = 4;  
  
        return true;  
}  
  
  
/*  
 * Auto-tune the number of XLOG buffers.  
 *  
 * The preferred setting for wal_buffers is about 3% of shared_buffers, with  
 * a maximum of one XLOG segment (there is little reason to think that more  
 * is helpful, at least so long as we force an fsync when switching log files)  
 * and a minimum of 8 blocks (which was the default value prior to PostgreSQL  
 * 9.1, when auto-tuning was added).  
 *  
 * This should not be called until NBuffers has received its final value.  
 */  
static int  
XLOGChooseNumBuffers(void)  
{  
        int                     xbuffers;  
  
        xbuffers = NBuffers / 32;  
        if (xbuffers > (wal_segment_size / XLOG_BLCKSZ))  
                xbuffers = (wal_segment_size / XLOG_BLCKSZ);  
        if (xbuffers < 8)  
                xbuffers = 8;  
        return xbuffers;  
}  

算法

自动计算:shared_buffers/32

上限:wal_segment_size/XLOG_BLCKSZ

下限:8*XLOG_BLCKSZ

例子

postgres=# show wal_segment_size ;  
 wal_segment_size   
------------------  
 16MB  
(1 row)  
  
postgres=# show wal_block_size  ;  
 wal_block_size   
----------------  
 8192  
(1 row)  
  
postgres=# show shared_buffers ;  
 shared_buffers   
----------------  
 32GB  
(1 row)  

以上参数,如果wal_buffers设置为-1,那么自动计算得到的值为16MB.

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
1月前
|
机器学习/深度学习 算法
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
递归算法题练习(数的计算、带备忘录的递归、计算函数值)
|
1月前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
3月前
|
算法 搜索推荐 图计算
图计算中的社区发现算法是什么?请解释其作用和常用算法。
图计算中的社区发现算法是什么?请解释其作用和常用算法。
24 0
|
3月前
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版标准版计算节点规格详解
PolarDB MySQL版标准版计算节点规格详解
117 1
|
3月前
|
算法
bellman_ford算法与dijkstra为什么dijkstra算法不能计算带有负权边图
bellman_ford算法与dijkstra为什么dijkstra算法不能计算带有负权边图
22 0
|
3月前
|
算法 定位技术 Python
地图权重计算(算法题)
地图权重计算(算法题)
22 0
|
3月前
|
算法 搜索推荐 数据挖掘
图计算中的图算法有哪些常见的类型?请举例说明每种类型的算法。
图计算中的图算法有哪些常见的类型?请举例说明每种类型的算法。
33 0
|
3月前
|
算法 搜索推荐 Java
图计算中的PageRank算法是什么?请解释其作用和计算原理。
图计算中的PageRank算法是什么?请解释其作用和计算原理。
20 0
|
3月前
|
算法 搜索推荐 Java
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
图计算中的图剪枝算法是什么?请解释其作用和常用方法。
14 0
|
3月前
|
机器学习/深度学习 存储 算法
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
数据结构与算法面试题:给定非负整数 m 和 n,计算不大于 m 的数字中,素数的个数。(提示:算法原理为埃氏筛、线性筛)
34 0

相关产品

  • 云原生数据库 PolarDB