Postgresql IO 花落知多少

今天要讲的是POSTGRESQL I/O系统的及周边一些系统的学习sharing .

首先我们先看一个图,这是一个PG内存结构的简图

但今天不是要说内存,而是要说关于buffer cache的问题,

 其实说白了就是数据在内存和磁盘之间的交互过程,如果提取的数据不在内存中,则需要从磁盘将数据读入到 page change 并且如果数据在内存中改变了,需要将数据刷入到磁盘的一个过程。

同时我们需要了解以下几点

缓冲写:通常是非阻塞的
缓冲读取:通常阻塞

顺序写比随机写快
覆盖较大数据块的操作通常更快

除此之外,checkpointer ,Background writer , wal writer 等等这些都会用到I/O 系统。所以调优PostgreSQL I/O对于构建高性能、可伸缩的数据库架构是必不可少的。

如: 

1  数据是否有预读机制,何种的预读机制能更有效的利用内存,而不是大量的I/O 读取。

2   更好的并发读取,可以采用更多的线程将需要的数据同时读取到系统中

由于POSTGRESQL 本身的buffer cache 并不全部HOLD 主, 而是联合OS的buffer 共同的对数据库进行处理,我们对比四种情况

1  没有 postgresql buffer ,OS buffer

2 没有 仅有OS 的cache 没有postgresql cache

3 POSTGRESQL  OS cache 和  POSTGRESQL buffer 共有的情况

所以POSTGRESQL 对相关的操作做了更多的优化例如

1 当工作集不适合共享缓冲区时,将数据写回操作系统

2 减少后端写的操作

3 提高IO吞吐量/利用率,特别是随机IO

4 减少随机I/O ,将其更多合并,变为顺序I/O

5  通过shared_buffer映射数据结构与排序支持


与其他的数据库不同,postgresql 更加强调系统在数据存取中的作用,更新的系统例如LINUX 的核心的版本的提升,对postgresql本身是有利的。

在Postgresql 中有一些需要注意的地方

1  Checkpoint 的设置 ,例如 max_wal_size , min_wal_size, checkpoint_timeout and comkpoint_completion_target 等配置参数会提高你的或者降低你的磁盘系统的负担,可以将脏页集中的或者分散的刷入你的磁盘系统。

2 需要注意你每天的事务量,WAL arvhive 文件的归档数量, 监控你checkpoint 的频率,以及以上的参数是否适合你当前繁忙或者不繁忙的数据库 系统。

3 Vacuum ,清理已经废弃的数据也是很重要的,防止表膨胀,而vacuum 也会造成磁盘的系统的负担,同时也要对 log_autovacuum_min_duration 进行关注,查看自动的真空的时间长度。一般来说自动真空就可以满足大部分系统的需求,但对于大表或者热表,可以在夜间工作不繁忙的情况下,进行手动或者半自动的真空,例如repack 等

4 与MYSQL 在某些方面有一些一致性,例如尽量给每个查询分配适合的work_men尤其在一些经常用到 group by  , order by 的系统,增加在内存可以解决的排序活动,避免更多要在磁盘进行排序后在给出结果的方式。

5  更合理有效的利用表空间,如同其他的数据库系统,将一个数据库分散在多个物理磁盘的方式,在POSTGRESQL 也是适用的,并且如果将 wal 日志放置在高级的I/O系统,例如SSD 磁盘,也是对系统性能有效的保证。

6 一般来说,在配置POSTGRESQL 中更倾向于将系统shared_buffer 进行合理的设置,但会忽略 effective_cache_size 的设置,如果想进行一个初始的设置可以将 shared_buffer 设置为总内存的 25%, 将effictive_cache_size设置为系统的额 50% 或更大。重要的 effictive_cache_size 的设置是和你查询的性能有很大的关系。

OK今天就到这里,有兴趣的DBER们可以发私信,可以将相关的PDF 和你们分享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值