今天要讲的是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 和你们分享。