PostgreSQL-shared_buffers(双缓存)

本文探讨了PostgreSQL中shared_buffers的作用,如何影响数据库性能,包括数据、索引和执行计划的缓存,以及os缓存的重要性。作者提供了设置shared_buffers的建议,以及预热缓存和性能测试的结果分析。

关于shared_buffers
这是一篇2018年写的,可以结合shared read一起看

什么是shred_buffer,我们为什么需要shared_buffers?
1.在数据库系统中,我们主要关注磁盘io,大多数oltp工作负载都是随机io,因此从磁盘获取非常慢。

2.为了解决这个问题,postgres将数据缓存在RAM中,以此来提高性能,即使ssd的情况下RAM也要快很多。

3.shared_buffers是一个8KB的数组,postgres在从磁盘中查询数据前,会先查找shared_buffers的页,如果命中,就直接返回,避免从磁盘查询。

shared_buffers存储什么?
1.表数据

2.索引,索引也存储在8K块中。

3.执行计划,存储基于会话的执行计划,会话结束,缓存的计划也就被丢弃。

什么时候加载shared_buffers?
1.在访问数据时,数据会先加载到os缓存,然后再加载到shared_buffers,这个加载过程可能是一些查询,也可以使用pg_prewarm预热缓存。

2.当然也可能同时存在os和shared_buffers两份一样的缓存(双缓存)。

3.查找到的时候会先在shared_buffers查找是否有缓存,如果没有再到os缓存查找,最后再从磁盘获取。

4.os缓存使用简单的LRU(移除最近最久未使用的缓存),而数据库采用的优化的时钟扫描,即缓存使用频率高的会被保存,低的被移除。

shared_buffers设置的合理范围
1.windows服务器有用范围是64MB到512MB,默认128MB

2.linux服务器建议设置为25%,亚马逊服务器设置为75%(避免双缓存,数据会存储在os和shared_buffers两份)

os缓存的重要性
数据写入时,从内存到磁盘,这个页面就会被标记为脏页,一旦被标记为脏页,它就会被刷新到os缓存,然后写入磁盘。所以如果os高速缓存大小较小,则它不能重新排序写入并优化io,这对于繁重的写入来说非常致命,因此os的缓存大小也非常重要。给予shared_buffers太大或太小都会损害性能。

查看shared_buffers,os缓存
这里需要使用到两个插件,pg_bufferscache系统已经自带可以直接创建扩展,pgfincore需要安装详细的步骤

查询 shared_buffers 占比和缓存情况:

SELECT
c.relname,
pg_size_pretty(count() * 8192) AS pg_buffered,
round(100.0 * count(
) / (SELECT setting FROM pg_settings WHERE name=‘shared_buffers’)::integer, 1) AS pgbuffer_percent,
round(100.0 * count(*) * 8192 / pg_table_size(c.oid), 1) AS percent_of_relation,
round(sum(pages_mem) * 4 / 1024, 0) AS os_cache_MB,
round(100 * sum(pages_mem) * 4096 / pg_table_size(c.oid), 1) AS os_cache_percent_of_relation,
pg_size_pretty(pg_table_size(c.oid)) AS rel_size
FROM
pg_class c
INNER JOIN pg_buffercache b ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d ON (b.reldatabase = d.oid AND d.datname = current_database() AND c.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = ‘public’))
GROUP BY
c.oid, c.relname
ORDER BY
3 DESC

<think>好的,用户想查询Greenplum数据库shared_buffers的配置项值,以及这个参数的含义和用法。首先,我需要回忆一下Greenplum的相关知识。shared_buffersPostgreSQL中是用于设置数据库使用的共享内存缓冲区大小的参数,而Greenplum是基于PostgreSQL开发的,所以可能类似。不过Greenplum是分布式数据库,可能有不同的配置方式。 根据用户提供的引用,比如引用[1]和[2]中提到的gpconfig命令,可以知道在Greenplum中,配置参数通常使用gpconfig工具来管理。比如gpconfig -c来设置参数,gpconfig --show来查看参数。所以用户可能想用gpconfig --show shared_buffers来查看当前配置。不过需要确认是否正确。 接下来,我需要确认shared_buffers在Greenplum中的具体作用。在PostgreSQL中,shared_buffers决定了数据库用于缓存数据的内存大小,对性能有重要影响。但是在Greenplum中,由于是MPP架构,每个segment都有自己的shared_buffers设置。因此,这个参数的配置可能需要考虑每个节点的情况,而不是整体。 然后,用户可能遇到的问题是如何正确设置这个参数。根据引用[5],在配置参数时需要考虑系统内存和其他参数的关系,比如gp_vmem_protect_limit、statement_mem等。所以需要提醒用户注意shared_buffers与其他内存参数的协调,避免内存不足或浪费。 另外,用户可能混淆了gpconfig的用法。根据引用[2],gpconfig --show用于显示参数值,而export是环境变量的设置,可能用户误将两者结合使用了。需要指出正确的命令是gpconfig --show shared_buffers。 还需要考虑Greenplum的最佳实践。比如,shared_buffers通常建议设置为系统内存的25%-40%,但具体数值需要根据集群规模和工作负载调整。同时,修改参数后需要重新加载配置或者重启集群,这需要提醒用户注意操作步骤,避免影响服务。 最后,生成相关问题时要围绕shared_buffers的相关配置、优化、与其他参数的关系,以及如何验证配置是否生效等方面展开。确保问题覆盖用户可能关心的其他方面。</think>### Greenplum中shared_buffers参数详解 #### 1. 参数查询方法 要查询Greenplum中`shared_buffers`的配置值,需使用以下命令: ```bash $ gpconfig --show shared_buffers ``` 此命令会显示Master和所有Segment节点的当前配置值[^2]。若需仅查看Master节点的值,可通过`psql`执行: ```sql $ psql -c 'SHOW shared_buffers;' ``` #### 2. 参数含义 `shared_buffers`定义了数据库实例使用的共享内存缓冲区大小,主要用于缓存表和索引的磁盘数据。在Greenplum分布式架构中,**每个Segment节点独立管理自己的缓冲区**,其配置需根据节点物理内存和工作负载调整[^1]。 #### 3. 推荐配置范围 - **默认值**:通常为`128MB` - **建议值**:设置为节点物理内存的**25%-40%** 例如节点内存为64GB时,建议配置: ```bash $ gpconfig -c shared_buffers -v 16GB ``` #### 4. 配置注意事项 1. **与内存保护参数协调**:需与`gp_vmem_protect_limit`(内存保护阈值)配合使用,避免OOM错误[^5]。 2. **避免过度分配**:保留足够内存给操作系统和其他进程。 3. **集群级操作**:修改后需执行以下命令使配置生效: ```bash $ gpstop -u # 仅重载配置文件 # 或 $ gpstop -ra # 完整重启集群 ``` #### 5. 性能影响分析 - **读优化**:增大该值可提升频繁访问数据的缓存命中率 - **写影响**:缓冲区过大会增加检查点(Checkpoint)的I/O压力 - **分布式特性**:Greenplum的MPP架构使得每个Segment的缓冲区独立管理,需全局平衡配置 #### 6. 验证配置生效 ```sql -- 查看所有节点当前运行值 SELECT * FROM gp_settings WHERE name = 'shared_buffers'; ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值