针对PG等开源与国产数据库的IO与文件系统优化要点

针对PG数据库的IO与文件系统优化要点在于两个方面,一方面是操作系统如何提供更高的IO吞吐能力给PG数据库实例;一方面是操作系统的IO延时如何尽可能的降低。为了达到操作系统层面的优化目标,我们需要从几个层面对操作系统IO和文件系统IO进行优化:

l磁盘设备优化

l文件系统优化

lVM和BUFFERED IO优化

PG数据库运行环境中的磁盘设备十分复杂,有传统的SATA/SAS机械盘,有SATA/SAS SSD闪存盘,有NVME SSD盘,也有SAN存储的磁盘或者NAS挂在的ISCSI/NFS磁盘。不同的磁盘在设备优化方面都存在较大的差异。不过无论磁盘设备如何优化其主要目的是让底层对的磁盘设备发挥出最大的IO吞吐能力,并且尽可能降低磁盘系统的IO延时。
磁盘设备的优化可以通过调整磁盘设备的参数来实现,PG数据库优化涉及的磁盘设备参数主要有2个,一个是scheduler,也就是磁盘的电梯调度算法,此算法针对机械盘有效,针对SSD盘或者SAN存储分配的磁盘都无效,这些类型的磁盘的scheduler设置为none就可以了。针对机械盘,如果要提高并发IO的能力,缩短IO延时,则需要设置为deadline,如果要考虑更高的吞吐量,而不在乎每个IO的延时,则设置为cfq就可以了。不同的操作系统版本,以及不同的磁盘驱动下,调度方法可能会略有不同,不过总体上来说,不外乎这三大类的变种。
针对磁盘设备的优化,另外一个参数是read_ahead_kb,对于SATA /SAS HDD来说,默认值为128KB,对于性能较好的设备来说,可以适当加大预读的参数设置,一般来说吞吐量优先的优化模式下,对于HDD盘的预读缓冲设置为2M-8M比较合适。而对于SSD盘,则不需要调整该参数(调整该参数对整体性能提升没有帮助)。
除了磁盘参数优化之外,为了确保大型PG数据库的稳定运行,要分配足够IO能力的磁盘设备给数据库。一块普通SAS 磁盘的IO能力大约为读IO 500 IOPS,写IO 200 IOPS(不同转速、型号的磁盘可能会有差异,我们可以用这个数值来做粗略的估算),根据你的系统需要的IO能力,你需要配置足够多的磁盘。因此在配置磁盘时不能只是考虑磁盘的容量,还要考虑磁盘的总体IO能力。另外如果磁盘通过RAID卡组成RAID组来使用,那么RAID组的方式,以及RAID卡的处理能力、缓冲多少都会影响磁盘的IO能力,这些都是在做磁盘设备优化的时候需要考虑到的。
除了磁盘参数之外,RAID组的设计也十分重要,对于WAL文件来说,其工作负载主要是顺序写,因此RAID 0+1是比较合适的RAID模式,WAL主要由WALWRITER写入,因此也不需要过多的考虑多个并发写入的情况,只需要考虑物理写的IO延时问题。选择IO延时较低,写IOPS较高的磁盘是优化的重点。而对于数据文件,因为读写的并发量十分大,而且读IO的比例比较高,IO以随机读、随机写和顺序读为主,因此大部分情况下RAID 5等模式也能够满足要求,不过不仅要考虑存储容量是否足够,针对不同的IO吞吐量,还需要考虑IOPS的能力是否能够满足数据库并发量的需求。而针对归档负载,因为归档大部分为顺序写,对写IO延时要求也不高,因此RAID 5等模式完全满足要求。
基于PG的文件系统优化包含文件系统类型的选择、文件系统规划、文件系统mount参数优化三个子项。我们分别来讨论这些子项。
文件系统选择
     在考虑文件系统优化的时候,我们首先要考虑该为PG数据库选择什么样的文件系统。在Linux上可选择的文件系统比较多,包括传统的ext4和xfs,也包括zfs/btrfs等COW技术的文件系统,都是可选择的对象。根据你的应用的特点去选择合适的文件系统对于今后运维优化十分关键。
Ext4文件系统和xfs文件系统都是PG数据库可选择的常规的带日志的文件系统,对比起来看,EXT4文件系统的性能优于XFS,不过性能的平稳度不如XFS,如果你想追求较高的吞吐量,则可以选择EXT4文件系统,如果你希望追求交易的平稳性,可以选择XFS文件系统。
ZFS/BTRFS文件系统都是基于COW(COPY ON WRITE)的文件系统,都支持本身的容错、卷压缩等,相对而言比较复杂一些。在总体性能上,这些文件系统在默认方式下都不如EXT4/XFS。不过基于SSD,内存缓冲优化等配置,这些文件系统也可以在某些硬件配置下,针对某些应用场景跑出比EXT4/XFS更好的性能。如果你想启用SSD或者内存加速,并且利用这些文件系统的卷压缩和容错功能,那么选择这些文件系统也是没问题的。
文件系统规划
从数据库优化的角度来看,针对不同的负载和组件进行IO隔离,可以优化大型数据库系统的性能。PG数据库的WAL/数据文件/归档三种业务负载的数据如果能够分别进行隔离,对于大型PG数据库来说可以获得更好的性能表现。
WAL文件需要较快的顺序写,因此可以存储在顺序写性能比较好的文件系统上;数据文件也可以根据其读写特性,分别存储在多个文件系统上,一方面隔离IO负载,另外一方面也可以增加IO子系统的总体能力(如果你的磁盘是SAN存储上划出来的,在存储端并未做隔离,那么这方面的隔离其实并无太大的效果);归档文件可以存储在容量较大,读写性能稍微差一点的磁盘上,从而节约成本。
文件系统MOUNT参数优化
针对EXT4/XFS文件系统,其优化的参数要求主要是noatime和nobarrier,如果使用SSD盘的话,一定要注意分区时做好对齐,否则SSD的性能会受损。下面是一个典型的EXT4的fstab的记录:
/dev/sdb1 /pgdata ext4 noatime,nobarrier,errors=remount-ro 0 1
针对ZFS文件系统,实际上的配置会比较复杂,因为针对不同的数据保护模式,不同的缓冲策略和压缩策略,会有十分复杂的配置。一些普遍适用的参数设置如下:
lrecordsize=8kB;
llogbias=throughput [latency] :根据你的应用场景需求可以选择吞吐量和延时,针对高并发要求的OLTP应用,可以选择LATENCY,对于具有大量数据扫描的分析类应用,可以选择throughput;
lzfs_arc_max :一定要设置该参数,避免arc cache占用过多的内存,导致操作系统换页。
如果你的数据库没有使用DIRECTIO,而使用了BUFFERED IO,那么针对VM和BUFFERED IO的优化是必须做的。其主要要点一是预留足够的物理内存,用于文件的读写CACHE,另外就是根据你的业务系统的特点与硬件的IO能力调整脏块刷新频率,如果底层物理IO性能很强,则降低刷新频率,减少脏块比例,如果底层IO性能较差,则往反方向调整。

发表评论

登录后才能评论
服务中心
服务中心
联系客服
联系客服
返回顶部