前言
数据库中的IO性能是优化中的重中之重,根据木桶原理,解决了IO这个最容易引起业务堵塞的问题,就能解决绝大部分性能问题。
下面从几个方面总结一下I/O优化问题。
第一,使用相对速度快的高性能存储设备。一般会考虑使用固态硬盘 (SSD) 或 RAID 阵列以获得更快的读写速度。
高性能低延迟的集中式SAN存储是传统大型数据库的主要存储介质,不过,本地化部署数据库中,使用本地存储可以降低成本,本地化部署时,使用本地SATA,SSD盘是不错的选择。
第二,优化 shared_buffers。确保 Kingbase 有足够的共享内存存放数据页。
调整此参数以匹配系统上可用的内存量以获得数据库最佳性能。不同业务类型的数据库,shared_buffers参数的设置会有所不同。
Kingbase数据库建议配置25%的物理内存给shared_buffers使用,这是一种当你不了解业务场景与数据分布时的普遍配置方案。举个例子,如果你的物理内存是256GB,而你的常用数据是100GB,那么设置一个大于100GB的shared_buffers可能是比较好的选择。
设置shared_buffers的首要原则是,不让操作系统产生较多的换页。
第三,优化wal_buffers。WAL日志是 Kingbase 中的一项安全相关功能,可确保事务的持久性和一致性。
配置 wal_buffers 参数以匹配您的工作负载并确保最佳 WAL 性能。调整 wal_buffers 的值时,重要的是要考虑生成 WAL 数据的速率,增加 wal_buffers 的值有助于降低磁盘写入频率并提高性能,不过在普通的负载下,调整wal_buffers并不能显著看到数据库性能的提升,只有当写入wal_buffers的速度大于Walwriter写盘的速度的时候,加大wal_buffers才会有特别明显的性能提升,这个场景会有很频繁的dml事务。作为一般规则,建议wal_buffers 的值设置为磁盘数据库块大小的倍数。
walwriter进程负责将wal日志从内存写入到磁盘,在写日志时的特点:
1)OLTP类型的高频事务数据库,会短时间产生大量wal日志,而写日志会非常频繁,也就是写的次数很多,IOPS很多,每秒的I/O次数很高,这要求磁盘IOPS必须很高。
2)每次写的日志量比较小。每次写的I/O量很小。
3)顺序写,walwriter进程顺序从wal_buffers往wal日志磁盘文件里写日志。
所以尽量将wal日志放在固态硬盘上以提高OLTP类型数据库的性能。对于操作系统,wal日志可以放到raid10或raid01这种条带化处理的磁盘上。
第四,热数据分区。热数据分区是一种将数据和索引分布在多个磁盘上的方法,它可以通过减少磁盘IO争用来提高数据库性能。
考虑使表和索引放在不同磁盘从而得到性能提升。将WAL存储与单独的存放数据的高性能存储分开存放也是一种有效的做法,对于高并发环境的数据库IO性能提升十分有效。
还可以利用tablespace逻辑空间将热表分散到不同的存储上,也是十分有效的热数据分区的方法。注意的是,要使用IO分区,首先要确保存放数据库的磁盘或者磁盘组本身在物理上是分区的,具有一定的隔离性,如果在一个磁盘组上分出多个逻辑卷,然后做IO分区,那么用处微乎其微。
第五,预热缓存。sys_prewarm 扩展可用于预热具有频繁访问的数据,减少在查询时所需数据页的磁盘 I/O 次数。
数据库中某条SQL执行计划不变的情况下,执行速度差异很大,如果SQL访问的大多数数据都在shared buffers中或者在OS的CACHE中,那么执行效率是较高的,也就是在执行计划中,有HIT关键字,表示在shared_buffers中命中的意思。因此在Kingbase数据库中对热数据做预热是有效提升数据库性能的方法。
安装完插件后,我们可以使用select sys_prewarm(‘tablename’)来预热某张表的数据。注意对于大型表谨慎操作,因为预热后的数据大量占用shared_buffers中内存。
sys_prewarm相关文档参考 https://www.cnblogs.com/kingbase/p/15125695.html
第六,优化检查点。检查点的功能是将共享缓冲区缓存中的脏页刷新到磁盘。降低检查点的频率和大小有助于减少磁盘 I/O 并提高性能。优化检查点性能的一些技术包括增加 checkpoint_timeout 和 checkpoint_completion_target 配置参数,以及使用更快的存储硬件来存储数据和 WAL 文件。
还可以调大max_wal_size以延缓检查点发生时间。在I/O的角度,增加检查点间隔可提高数据库性能,但如果数据库意外崩溃,由于会应用更多的wal日志,这会增加数据库实例恢复的时间。
第七,调整CBO策略参数。调整 effective_cache_size,random_page_cost等多个参数,这些参数都是CBO优化器来评估执行计划时的成本估算的重要参数,在一个有数万甚至数十万条SQL语句的数据库系统而言,CBO能够产生合理的执行计划对于数据库性能至关重要,
effective_cache_size 配置参数用于估计数据库可用的磁盘缓存量,从而确定使用全表扫描或者索引扫描数据。在有大量ram的情况下,effective_cache_size值越大,优化器越趋向于使用索引扫描。effective_cache_size = RAM * 0.7是建议参考值。
random_page_cost 配置参数确定随机磁盘 I/O 相对于顺序磁盘 I/O 的成本。设置此参数以准确反映系统上随机磁盘 I/O 的成本。
根据磁盘类型的不同,对 random_page_cost 的设置也会有所不同:对于 HDD,可以设置为 4.0 到 4.5;对于 SSD,可以设置为 1.0 到 1.5。