案例中心

使用 pgbuffercache 扩展在 PostgreSQL 中确定 sharedbuffer

datetime

2026-01-27 13:03:42

阅读数量

7

使用 pgbuffercache 扩展在 PostgreSQL 中确定 optimal sharedbuffers 值

重点摘要

在 OLTP 数据库中,缓存通常用于提高频繁访问信息的读取速度。合理设置 sharedbuffers 的值对 PostgreSQL 性能至关重要,可以有效降低数据库运营成本。本文讨论了如何使用 pgbuffercache 扩展来优化 sharedbuffers 的配置。无论是在自我管理环境还是托管在 Amazon Aurora PostgreSQL 兼容版 或 Amazon RDS for PostgreSQL中,所述优化策略均适用。

sharedbuffers 概述

在 PostgreSQL 中,主要的共享内存区域包括 sharedbuffers、walbuffers 和 CLOG 缓冲区。sharedbuffers 区域用于存储缓存数据和脏页。脏页是因写入操作而被修改的数据页。这些脏页会被后台写入进程刷新到磁盘,目的在于确保数据页移动到永久存储,并为 sharedbuffers 释放可用空间。此外,基于 检查点设置 的检查点会在后台自动生成,使所有脏页写入磁盘,以创建崩溃恢复时的还原点。

实际上,sharedbuffers 的默认配置因 PostgreSQL 的部署类型而异。社区版 PostgreSQL 的默认值为 128 MB,而 Amazon RDS for PostgreSQL 默认值由公式 DBInstanceClassMemory/32768 计算得出。理想的 sharedbuffers 分配为内存的 3035。与之相比,Amazon Aurora PostgreSQL 则使用公式 SUM(DBInstanceClassMemory/12038 50003) 湖算默认值,因其不依赖操作系统进行数据缓存,因此其 sharedbuffers 的配置通常高于 Amazon RDS for PostgreSQL。

如何设置 sharedbuffers

在 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 中,您可以建立 自定义参数组 来修改任何参数配置。sharedbuffers 设置通过此自定义参数组进行调整。请注意,sharedbuffers 是静态参数,任何修改都需重启数据库实例才能生效。此参数以 8 kB 块的数量为单位进行定义。

利用以下公式,您可以确定 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 的 sharedbuffers 值:

sharedbuffers = (目标百分比 x 总 RAM 的 GB 数 x 1024 x 1024) / (100 x 8)

例如,若您的 RDS 实例为 dbm6g12xlarge192 GB RAM,则 sharedbuffers 参数的值为 10066329 设置 40 的总 RAM:

(40 x 192 x 1024 x 1024) / (100 x 8)

设置参数组中的 sharedbuffers 值的步骤如下:

在 Amazon RDS 控制台中,选择导航窗格中的 数据库。转到您的数据库,在 实例部分中,选择与之关联的参数组的链接。在 可修改参数 部分中,搜索并使用前述公式修改 sharedbuffers 参数。

新的 sharedbuffers 值应用需要重启实例。

使用 pgbuffercache 扩展在 PostgreSQL 中确定 sharedbuffer

sharedbuffers 与 I/O 利用率

在 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 中,对于读密集型工作负载,数据库引擎尝试使用缓存中的页来满足查询请求。如果所需页不在缓存中,PostgreSQL 数据库引擎会启动存储层读取以获取它们。完全由缓存提供服务的工作负载不会产生读取 I/O 操作;然而,如果不是,则会对来自存储的页产生 I/O 费用。

Amazon CloudWatch 提供 BufferCacheHitRatio 指标,显示由缓存满足的请求百分比。更高的命中率意味着降低了读取 I/O。因此,为了减少读取 I/O,sharedbuffers 应大到能够容纳大部分工作数据集。想要深入了解 Amazon RDS for PostgreSQL 的 I/O 特性,请参考 I/O 大小和卷吞吐量限制。

分析 sharedbuffers 的好处

在 PostgreSQL 中,sharedbuffers 扮演着至关重要的角色,它通过在内存中存储数据和索引,大幅减少磁盘 I/O 操作的次数,从而提高查询性能并降低总体数据库成本。sharedbuffers 采用最近最少使用LRU算法进行缓存页处理。LRU 缓存算法在缓存满时会移除最少使用的数据页,以腾出空间。

当 sharedbuffers 过小,会导致频繁读取存储,缓存中的页面需要不断上下刷写,从而影响性能,降低并发查询能力。然而,设置过高的 sharedbuffers 值会加重系统内存负担,导致交换,从而影响性能。在调整 sharedbuffers 设置时,需考虑到系统可用的内存量、工作数据集的大小以及数据库的工作负载。分析 sharedbuffers 设置并适时调整,可以确保 PostgreSQL 数据库以最佳性能运行。

使用 AWS 监控工具确定 sharedbuffers 修改

在 Amazon Aurora PostgreSQL 中,BufferCacheHitRatio CloudWatch 指标可以帮助您确定是否需要调整 sharedbuffers。如果 BufferCacheHitRatio 低于 90,则考虑增加 sharedbuffers 以从缓存中服务更多数据。在 Amazon RDS for PostgreSQL 中,可以通过查询 pgstatiousertables 和 pgstatiouserindexes 系统目录来识别命中率。

以下查询识别表的命中率:

sqlSELECTSUM(heapblksread) AS heapreadSUM(heapblkshit) AS heaphitSUM(heapblkshit) / (SUM(heapblkshit) SUM(heapblksread)) AS hitratioFROM pgstatiousertables

以下查询识别索引的命中率:

sqlSELECTSUM(idxblksread) AS idxreadSUM(idxblkshit) AS idxhit(SUM(idxblkshit) SUM(idxblksread)) / SUM(idxblkshit) AS ratioFROM pgstatiouserindexes

为了最终确定 sharedbuffers 的修改,您可以使用 Amazon RDS 性能见解。性能见解是一个数据库性能调优和监控功能,帮助您快速评估数据库工作负载,并确定后续措施。不同计数指标如 blkshits、blksread、tupfetched 和 tupreturned 可用于更好地估算 sharedbuffers。性能见解提供 7 天的性能数据历史,且无需收费。有关定价详细信息,请参见 性能见解定价。

使用 pgbuffercache 扩展分析 sharedbuffers

分析命中率后,您可以使用 pgbuffercache 扩展实时查看共享缓存中的内容。pgbuffercache 扩展提供有关缓冲区缓存的有用信息,帮助您分析 PostgreSQL 数据库的性能。pgbuffercache 函数提供有关缓存中缓冲区的数量和大小、命中和未命中次数以及个别缓冲区状态的信息,这些信息可以帮助诊断性能问题并优化数据库性能。

pgbuffercache 结果集为共享缓存中的每个缓冲区提供一行。如果缓冲区未使用,所有字段将显示为 null,唯一的 bufferid 字段会有值。高数量的缓存未命中可能表明 sharedbuffers 值设置过低,导致数据库进行过多 I/O 操作。如果观察到这种情况,您应考虑上调 sharedbuffers 值,从而扩大缓存区减少未命中。

接下来看看如何使用 pgbuffercache 分析缓冲区缓存。

注意 所有 SQL 查询已在 PostgreSQL 15 上测试,您可能需根据较旧版本 PostgreSQL 修改查询。

使用您首选的 SQL 客户端连接 Aurora PostgreSQL 或 RDS for PostgreSQL 数据库。运行以下 SQL 语句安装 pgbuffercache 扩展:

sql CREATE EXTENSION pgbuffercache

运行以下查询以显示根据使用的缓冲区缓存排序的关系:

sql SELECT crelname count() AS buffers FROM pgbuffercache b INNER JOIN pgclass c ON brelfilenode = pgrelationfilenode(coid) AND breldatabase IN (0 (SELECT oid FROM pgdatabase WHERE datname = currentdatabase())) GROUP BY crelname ORDER BY 2 DESC LIMIT 10

以下截图展示输出。

接下来的查询

要识别占用 sharedbuffers 的前 10 个关系及百分比利用率,您可以运行以下查询:

sqlSELECT crelnamepgsizepretty(count()8192) AS buffersizepgsizepretty(pgrelationsize(coid)) AS relationsizeRound(1000 Count() / (SELECT settingFROM pgsettingsWHERE name = sharedbuffers)INTEGER 2) AS bufferspercentROUND(count()8192100/ pgrelationsize(coid)numeric 2) AS relationpercentCASEWHEN crelkind = r THEN tableWHEN crelkind = i THEN indexWHEN crelkind = S THEN sequenceWHEN crelkind = t THEN TOAST tableWHEN crelkind = v THEN viewWHEN crelkind = m THEN materialized viewWHEN crelkind = c THEN composite typeWHEN crelkind = f THEN foreign tableWHEN crelkind = p THEN partitioned tableWHEN crelkind = I THEN partitioned indexELSE Unexpected relkindEND as relationtypeFROM pgclass cINNER JOIN pgbuffercache bON brelfilenode = crelfilenodeINNER JOIN pgdatabase dON (breldatabase = doidAND ddatname = Currentdatabase())GROUP BY crelname coidORDER BY pgtotalrelationsize(coid) DESCLIMIT 10

输出列如下:

buffersize 与关系相关的缓冲区大小relationsize 可读大小的关系bufferpercentage 在 sharedbuffers 中占用的关系百分比relationpercentage 在 sharedbuffers 中的关系百分比relationtype 关系类型,如表、索引或序列

在本测试场景中,sharedbuffers 设置为 195 GiB,而 pgbenchaccounts 表的大小为 139 GiB。5250的 sharedbuffers 被这个表的 1 GiB 占用。倘若该表的工作数据集大于缓存的数据,则需要调高 sharedbuffers 的值,以允许缓存更多数据。在调节 sharedbuffers 的值时,必须监控 FreeableMemory,因为其它进程所需的内存如 workmem 和 maintenanceworkmem也来自同一内存池。如果无法增加 sharedbuffers 的值,建议升级实例类以确保有更大的总 RAM 分配。

sharedbuffers 与 pgprewarm

对于业务关键的读取工作负载,将数据设置为预加载至 sharedbuffers 可提升性能。Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 支持 pgprewarm 扩展,提供便利方式将关系数据加载到缓存中。在前述示例中,如果确定 pgbenchaccounts1 是一个业务关键表,并计划在此表上发布报告,可以运行以下代码对数据进行预热。请注意,预热数据会根据 LRU 基础推走 sharedbuffers 内容,这可能影响其他读工作负载。

sqlSELECT pgprewarm(pgbenchaccounts1)

结论

在本文中,我们探讨了 sharedbuffers 的概念及在 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 中的 pgbuffercache 扩展。合适的 sharedbuffers 值直接影响 PostgreSQL 的性能。无论是 Amazon Aurora PostgreSQL 还是 Amazon RDS for PostgreSQL 都支持 pgbuffercache 扩展,使得获取 PostgreSQL 数据库缓冲区缓存信息变得简单。CloudWatch 指标和性能见解计数帮助评估缓存数据所支持的工作负载。通过了解缓冲区缓存的状态,您能识别性能优化的方向,并微调 PostgreSQL 数据库的配置。

如果您有任何问题或建议,请随时留言。

速云梯官网登录入口

作者介绍

Kiran Singh 是 AWS 的高级合作伙伴解决方案架构师,专注于 Amazon RDS 和 Amazon Aurora,主要聚焦于关系数据库的优化、可扩展性和安全性,帮助客户与合作伙伴构建高效的解决方案。

Vivek Singh 是 AWS 的高级数据库专家技术客户经理,专注于 Amazon RDS for PostgreSQL 和 Amazon Aurora PostgreSQL 引擎,为大型企业客户提供技术支持,分享数据库最佳实践,具备超过 17 年的开源数据库解决方案经验。