前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Postgresql 理解cache 在 postgres中的意义 与 share buffer 到底设置多大性能最好

Postgresql 理解cache 在 postgres中的意义 与 share buffer 到底设置多大性能最好

作者头像
AustinDatabases
发布于 2022-01-11 08:57:05
发布于 2022-01-11 08:57:05
2.6K1
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

数据库中一个核心的功能就是数据的访问, 数据的访问与计算单元越近越好,而CPU中的缓存的价格是昂贵的,并且也是稀少的,这就需要有CPU的 1 2 3 级别的缓存,CPU有一大部分的时间在处理这些缓存之间的信息交换,当然这些CACHE 也不大够处理我们的数据,所以就有了内存,同时为了永久的存储信息,将这些信息又存储到了磁盘。这就是我们整体的数据处理和存储最基本的原理,而数据库软件也一直以此来设计数据库的软件,并让他达到最大性价比。

POSTGRESQL 数据库的CACHE 要接受什么,数据,以及索引,这些信息已8KB的块存储在磁盘上,在需要处理的时候,需要将他们读入4KB的为存储单元的CACHE 中。除此以外还有查询的执行计划,把他作为一个定义存储到缓存中。

对于数据库最重要的就是如何将数以亿计的数据从磁盘加载到内存中,让计算变得可能,并且尽可能的快, postgresql 与其他的数据库不同在于,它对数据的依赖不在与磁盘,而在于LINUX 的cache,每次的数据提取都是从linux的file cache中获得的。而数据库中大部分的努力都是想让处理的数据尽量留在内存中,并且时间足够长,同时也想让不在使用的数据尽量的从内存中“轰出来”。这就是我们熟悉的LRU 算法对于数据库的意义。

PG 通过postmaster 为每一个数据库数据的访问分配一个基于他下面的子进程,并且这些进程在访问 share buffer后,基于LRU算法会让这些数据持续的在缓冲中,当这些数据在一定时间不再需要后,会通过checkpoint 子进程将这些数据重新写入到磁盘,空出缓冲承接新的数据。

实际上cache 在PG中的意义(这里的cache 指 os cache)

1 降低PG 内部缓冲与数据调用的代码,而是调用操作系统代码调取数据,系统的构造变得简单,并且随着操作系统的升级,对于PG本身的性能有提高的可能,属于一箭三雕。(当然如果操作系统不怎么样,那就.....)

2 通过os cache 加速数据的读取,os cache 够大 share buffer 的意义会削弱

反思: 随着硬件的变动,SSD 的磁盘系统性能越来越高,价格越来越便宜,硬件的变化,会对PG 的性能提升更有意义,在某些SSD 磁盘系统做测试,通过提前加载数据对性能的提高有限。

我们做一个实验,看看数据在内存中和不再内存中查询的差别(以下实验在传统SATA磁盘系统)

我们灌入5000万的数据到PG的数据库中。通过语句我们可以查出表在内存中的数据块的数量。

我们通过命令将数据库中people_warm 的缓存在 share_buffer中清空

我们通过简单的查询5000万表的数据,之间在26秒

此时一部分数据已经进入到了缓存。

我们再次将数据清空。通过pg_prewarm 将数据加载进缓存中。

可以看到这次查询的时间仅仅需要2秒钟

执行计划也没有什么不同。此时这就能证明,数据在buffer中 和不再buffer中的巨大区别.

这里 pg_prewarm 有三种模式

1 Prefetch : 将数据迁移至LINUX 系统的 OS CACHE,而不是PG的buffer,数据加载的方式是异步的

2 Read: 读取所有的数据加载进行LINUX CACHE

3 Buffer:读取所有的数据块到PG的 share buffer中。

下图介绍了几个2个工具与参数的不同在数据引入内存的深度问题

所有通过工具的使用也能了解一点 postgresql 本身的数据读取是必须通过LINUX的 缓存,也可以叫os cache.

另一个问题就是PG的 share_buffer 与系统剩余内存的容量之间的关系,之前官方给出的调整参数是 1/4 share buffer 3/4 LINUX OS

那我们来通过一个测试来看看是不是如此,

这里有一个4核心,8G内存,SSD 磁盘系统的系统,并且这里通过pgbench来产生一个5000万的表。然后我们通过将share buffer 变动的情况,看看数据库的性能与share buffer 变动的关系。

pgbench -i --unlogged-tables -s 500 -U postgres -p 5432 -d pgbench

之前写的一篇与这个有关的文字

PostgreSQL 自己的 DB buffer & 与别的人的OS cache 之 回答问题

https://cloud.tencent.com/developer/article/1536270

经过一个简单的测试,我们将shared buffer 设置成不同的数值,然后观察每条SQL 的平均延迟,以及30秒内运行的事务总数。当然一下的测试并不严谨,严谨的测试需要在时间,客户端的数量,以及测试数据等等都进行更多的数据测试,并且每个测试至少要测试10次,并取平均数。

这里并没有这么多时间,所以以下测试结果,只能参考,根据结果

1 share buffer 可以设置超过总物理内存的大小,系统不会报错

2 这里 3G ,占总内存的 37.5% 的结果是最好的,而不是 2G 根据官方的建议,我们这里应该设置成2G

3 虽然2G 不是最好的成绩,但是确实这9次测试里面较好的成绩

4 最差的成绩就是将所有的内存都设置成 share buffer

5 将share buffer 设置成9G 并不是这些成绩里面最差的成绩比 5G 4G 的成绩要好。

当然以上的测试并不能说明我们最好将内存设置为总体内存的37.5% ,但我们需要思考,并且有时候需要问自己一个问什么

1 为什么官方的建议是0.25

2 原因是什么

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
你还,文中提到:“我们通过命令将数据库中people_warm 的缓存在 share_buffer中清空”,请问是什么命令,谢谢
你还,文中提到:“我们通过命令将数据库中people_warm 的缓存在 share_buffer中清空”,请问是什么命令,谢谢
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
PostgreSQL 数据读取快慢,你有做主的权利
PostgreSQL使用shared_buffers来缓存内存中的块。其思想是减少磁盘I/O并以最有效的方式加速数据库。在正常操作期间,数据库缓存将非常有用,并确保良好的响应时间。但是,如果由于某种原
AustinDatabases
2019/10/23
1.4K0
PostgreSQL  数据读取快慢,你有做主的权利
PG中的WAL:1 buffer cache
数据库管理系统需要操作的数据位于RAM,并会异步刷写到磁盘或其他非易失性存储介质。写被推迟,推迟时间越久IO次数越少,系统操作越快。
yzsDBA
2021/05/17
9550
PG中的WAL:1 buffer cache
Postgresql extension 挑挑拣拣 (1)
PostgreSQL 的extension是需要仔细说说,如果说MYSQL 有plug-in的话让数据库变得灵活,可也是一个配角。POSTGRESQL 的 extension 经常可以反客为主,把postgresql 变成POSTGIS 数据库就是一个extension的功劳。
AustinDatabases
2021/04/23
7130
postgresql email列表对NVM WAL BUFFER的讨论
本文介绍NVM WAL BUFFER的email list,详细了解开发者对此的讨论,以此深入
yzsDBA
2021/01/05
6480
Postgresql内部缓存与OS缓存的关系
mysql通常使用odirect使数据绕过OS缓冲区落盘,wal还是使用系统缓冲。这样数据的写盘不会造成系统刷脏抖动。在pgsql中数据是与OS缓冲绑定的,自己没有做字节对齐,也不使用odirect的方式直写设备,社区对数据直写的态度也一直很悲观,原因是之前也做过很多探索,结果都不是很好:
mingjie
2022/05/12
5880
Postgresql内部缓存与OS缓存的关系
PostgreSQL 自己的 DB buffer & 与别的人的OS cache 之 回答问题
最近周四的一篇文字中的分享引起了部分同学的注意,私信我,并问了一些问题,这里挑拣了 红旗迎东风(希望名字没有敲错)同学的问题。他的问题主要是围绕 POSTGRESQL buffer 与 os cache 之间的关系,展开的。
AustinDatabases
2019/11/10
1.2K0
PostgreSQL postgresql 读书会 一期 6 EFFECTIVE_CACHE_SIZE 到底什么意思
有时候一本书不是每一章或者每一部分都写的让你觉得可以仔细的阅读后能得到什么, 本期出于这个状态, 书中的第一句中提到 effecitve cache size 应该进行评估,评估的标准系统的系统的内存怎么能满足操作系统中磁盘的caching 和 当数据库在正常运作后的内存的使用. 整体来说对于postgres来说这个值在50% - 70% 与之有关的设置例如 random_page_cost 的值,会影响index scan 或 sequential scans 在数据查找中的到底更偏向于那个.默认是4.0 在使用 san/nas 技术可以将其调整为3 SSD的使用可以将其调整为1.5 到2.5.
AustinDatabases
2020/08/13
7060
PostgreSQL postgresql 读书会 一期  6 EFFECTIVE_CACHE_SIZE 到底什么意思
PostgreSQL 必须要知道和安装的扩展 extension (2)
POSTGRESQL 的好处就在于扩展,一个好的扩展可以让POSTGRESQL 功能犹如变形金刚一样. 上次说了几个extension ,这期说说我们在生产上必须安装的几个extension.
AustinDatabases
2021/07/15
2.2K0
PostgreSQL  必须要知道和安装的扩展 extension (2)
PostgreSQL Bgwriter 与 checkpoint 性能 与性能测试
话题的从系统性能优化讲起, 熟悉PG的同学都明白PG大部分的与硬件打交道的功能都通过LINUX来进行,如何让PG 与 LINUX 之间更协调的工作就是一个重点.
AustinDatabases
2021/09/24
1.8K0
PostgreSQL  Bgwriter 与 checkpoint  性能 与性能测试
--PostgreSQL 怎么正确的开始POSTGRESQL 调优的活动 1
文字内容来自于 postgresqlopen 2019 Mistaken And Ignored Parameters While Optimizing A PostgreSQL Database 的部分内容,分2期来完成.
AustinDatabases
2020/11/10
8830
--PostgreSQL  怎么正确的开始POSTGRESQL 调优的活动  1
PostgreSQL 如何“霸占”系统OS cache 提升查询性能
上期回答了关于PG数据库缓存和系统的缓存之间的一些关系,其中可能有有一些可以在讨论的问题,既然数据库可以“黏住”常用的数据,那系统的缓存我们还是否可以继续利用,还是仅仅拿他当一个所谓的“二级缓存”(这个词可能不严谨)来使用。
AustinDatabases
2019/11/10
1.2K0
PostgreSQL 为什么不能并发太高与PG14 如何解决关键问题
MYSQL 的并发在硬件配置OK的情况下, 4000- 5000 都是可以的, 相对PostgreSQL 一直被吐槽的高并发连接下的性能问题,可能的原因有两点
AustinDatabases
2021/09/24
3.8K1
PostgreSQL  为什么不能并发太高与PG14 如何解决关键问题
A Comprehensive Guide: PostgreSQL Shared Buffers(译)
与MySQL设置innodb_buffer_pool_size = 80%左右的系统内存相比,也就是将操作系统大部分内存分配给Innodb的buffer pool的缓存管理机制不同,Postgresql采用数据库采用实例buffer和操作系统buffer双缓存(effective_cache_size)的工作模式,这一点两者还是有着比较本质上的差异的。
数据库架构之美
2020/12/01
8920
A Comprehensive Guide: PostgreSQL Shared Buffers(译)
PostgreSQL 如果放在 X86 或 ARM 上“摩擦” 到底哪个性能好?(翻译)
未来的数据库发展一定是往云上发展的,倒不是云有什么好,主要还是成本的因素,成本因素比较复杂,这里不探讨,如果你单单认为只是一些机房等基础那就大大的错误了,有机会在探讨为什么以后DBA 大多都不会触及一些基础的数据库架构,要在云上去进行新一代的DBA 生涯了。
AustinDatabases
2021/11/26
2.3K0
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
针对PolarDB for PostgreSQL 提出的特性,其中PG原生数据库最大的问题之一是磁盘空间占用的问题,相对于其他的数据库产品PostgreSQL 数据库会在使用中占用更多的磁盘空间,这是人尽皆知的问题,其他的两个问题也需要进行测试,通过测试来验证PolarDB for PostgreSQL产品是否和宣传的比PostgreSQL RDS产品更具竞争力。
AustinDatabases
2024/06/18
4690
PolarDB VS PostgreSQL  "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
Postgresql 设置过大的share buffer 导致无法启动
This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 17667276800 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.
AustinDatabases
2021/03/16
3.6K1
Postgresql  设置过大的share buffer 导致无法启动
Postgresql IO 对于PG的 过去,现在 , 未来 (1 过去和我们曾经解决的问题)
此文来自于AndresFreund,PG社区资深开发,探讨IO对于PG方面的问题。此翻译和文字来自于视频,因为部分英文听的比较费劲,所以可能有失误的地方,尽请见谅。
AustinDatabases
2022/12/13
4280
Postgresql    IO  对于PG的 过去,现在 , 未来 (1  过去和我们曾经解决的问题)
Postgresql IO 花落知多少
今天要讲的是POSTGRESQL I/O系统的及周边一些系统的学习sharing .
AustinDatabases
2019/11/04
1.3K0
Postgresql IO 花落知多少
性能测试必备知识(11)- 怎么理解内存中的Buffer和Cache?
https://www.cnblogs.com/poloyy/category/1806772.html
小菠萝测试笔记
2020/08/18
9960
性能测试必备知识(11)- 怎么理解内存中的Buffer和Cache?
综合指南:postgresql shared buffers
本文主要针对下面问题详述PG的共享内存:PG中需要给共享内存分配多少内存?为什么?
yzsDBA
2021/01/05
1.6K0
综合指南:postgresql shared buffers
推荐阅读
相关推荐
PostgreSQL 数据读取快慢,你有做主的权利
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档