关于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

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

被折叠的 条评论
为什么被折叠?



