InnoDB存储引擎 (第9章 性能调优)

本章将从以下几个方面集中讲解InnoDB存储引擎的性能问题:

选择合适的CPU

内存的重要性

硬盘对数据库性能的影响

合理地设置RAID

操作系统的选择也很重要

不同文件系统对数据库的影响

选择合适的基准测试工具

9.1  选择合适的CPU

InnoDB存储引擎一般都应用于OLTP的数据库应用,这种应用的特点如下:

用户操作的并发量大

事务处理的时间一般比较短

查询的语句较为简单,一般都走索引

复杂的查询较少

可以说OLAP是CPU密集型的操作,而OLTP是IO密集型的操作。建议在采购设备时,将更多的注意力放在提高IO的配置上。

如果CPU是多核的,可以通过修改参数innodb_read_io_threads和innodb_write_io_threads来增大IO的线程,这样也能更充分有效地利用CPU的多核性能。

9.2  内存的重要性

如何判断当前数据库的内存是否已经达到瓶颈了呢?可以通过查看当前服务器的状态,比较物理磁盘的读取和内存读取的比例来判断缓冲池的命中率,通常InnoDB存储引擎的缓冲池的命中率不应该小于99%

show global status like '%Innodb%read%' ;

以下公式可以计算各种对缓冲池的操作:

9.3  硬盘对数据库性能的影响

9.3.1 传统机械硬盘

机械硬盘有两个重要的指标:一个是寻道时间,另一个是转速。当前服务器机械硬盘的寻道时间已经能够达到3ms,转速为15 000RPM(rotate per minute)。传统机械硬盘最大的问题在于读写磁头,读写磁头的设计使硬盘可以不再像磁带一样,只能进行顺序访问,而是可以随机访问。但是,机械硬盘的访问需要耗费长时间的磁头旋转和定位来查找,因此顺序访问的速度要远高于随机访问。传统关系数据库的很多设计也都是在尽量充分地利用顺序访问的特性。

通常来说,可以将多块机械硬盘组成RAID来提高数据库的性能,也可以将数据文件分布在不同硬盘上来达到访问负载的均衡。

9.3.2 固态硬盘

固态硬盘,更准确地说是基于闪存的固态硬盘,是近几年出现的一种新的存储设备,其内部由闪存(Flash Memory)组成。因为闪存的低延迟性、低功耗,以及防震性,闪存设备已在移动设备上得到了广泛的应用。企业级应用一般使用固态硬盘,通过并联多块闪存来进一步提高数据传输的吞吐量。

另一方面,闪存中的数据是不可以更新的,只能通过扇区(sector)的覆盖重写,而在覆盖重写之前,需要执行非常耗时的擦除(erase)操作。

图9-2显示了一个双通道的固态硬盘架构,通过支持4路的闪存交叉存储来降低固态硬盘的访问延时,同时增大并发的读写操作。通过进一步增加通道的数量,固态硬盘的性能可以线性地提高,例如我们常见的Intel X-25M固态硬盘就是10通道的固态硬盘。

由于闪存是一个完全的电子设备,没有读写磁头等移动部件,因此固态硬盘有着较低的访问延时。当主机发布一个读写请求时,固态硬盘的控制器会把I/O命令从逻辑地址映射成实际的物理地址,写操作还需要修改相应的映射表信息。算上这些额外的开销,固态硬盘的访问延时一般小于0.1ms左右。图9-3显示了传统机械硬盘、内存、固态硬盘的随机访问延时之间的比较。

对于固态硬盘在InnoDB存储引擎中的优化,可以增加innodb_io_capacity变量的值达到充分利用固态硬盘带来的高IOPS特性。不过这需要用户根据自己的应用进行有针对性的调整。在InnoSQL及InnoDB1.2版本中,可以选择关闭邻接页的刷新,同样可以为数据库的性能带来一定效果的提升。

此外,还可以使用InnoSQL开发的L2 Cache解决方案,该解决方案可以充分利用固态硬盘的超高速随机读取性能,在内存缓冲池和传统存储层之间建立一层基于闪存固态硬盘的二级缓冲池,以此来扩充缓冲池的容量,提高数据库的性能。与基于磁盘的固态硬盘Cache类似的解决方案还有Facebook Flash Cache和bcache,只不过它们是基于通用文件系统的,对InnoDB存储引擎本身的优化较少。

此外,还可以使用InnoSQL开发的L2 Cache解决方案,该解决方案可以充分利用固态硬盘的超高速随机读取性能,在内存缓冲池和传统存储层之间建立一层基于闪存固态硬盘的二级缓冲池,以此来扩充缓冲池的容量,提高数据库的性能。与基于磁盘的固态硬盘Cache类似的解决方案还有Facebook Flash Cache和bcache,只不过它们是基于通用文件系统的,对InnoDB存储引擎本身的优化较少 .

9.4  合理地设置RAID

RAID(Redundant Array of Independent Disks,独立磁盘冗余数组)的基本思想就是把多个相对便宜的硬盘组合起来,成为一个磁盘数组,使性能达到甚至超过一个价格昂贵、容量巨大的硬盘。由于将多个硬盘组合成为一个逻辑扇区,RAID看起来就像一个单独的硬盘或逻辑存储单元,因此操作系统只会把它当作一个硬盘。

RAID的作用是:

增强数据集成度

增强容错功能

增加处理量或容量

9.4.1 RAID类型

根据不同磁盘的组合方式,常见的RAID组合方式可分为RAID 0、RAID 1、RAID 5、RAID 10和RAID 50等。

RAID 0

将多个磁盘合并成一个大的磁盘,不会有冗余,并行I/O,速度最快。RAID 0亦称为带区集,它将多个磁盘并列起来,使之成为一个大磁盘,如图9-4所示。在存放数据时,其将数据按磁盘的个数进行分段,同时将这些数据写进这些盘中。所以,在所有的级别中,RAID 0的速度是最快的。但是RAID 0没有冗余功能,如果一个磁盘(物理)损坏,则所有的数据都会丢失。理论上,多磁盘的效能就等于(单一磁盘效能)×(磁盘数),但实际上受限于总线I/O瓶颈及其他因素的影响,RAID效能会随边际递减。也就是说,假设一个磁盘的效能是50MB/s,两个磁盘的RAID 0效能约96MB/s,三个磁盘的RAID 0也许是130MB/s而不是150MB/s。

RAID 1

两组以上的N个磁盘相互作为镜像(如图9-5所示),在一些多线程操作系统中能有很好的读取速度,但写入速度略有降低。除非拥有相同数据的主磁盘与镜像同时损坏,否则只要一个磁盘正常即可维持运作,可靠性最高。RAID 1就是镜像,其原理为在主硬盘上存放数据的同时也在镜像硬盘上写相同的数据。当主硬盘(物理)损坏时,镜像硬盘则代替主硬盘的工作。因为有镜像硬盘做数据备份,所以RAID 1的数据安全性在所有的RAID级别上来说是最好的。但是,无论用多少磁盘作为RAID 1,仅算一个磁盘的容量,是所有RAID中磁盘利用率最低的一个级别。

RAID 5

是一种存储性能、数据安全和存储成本兼顾的存储解决方案。它使用的是Disk Striping(硬盘分区)技术。RAID 5至少需要三个硬盘,RAID 5不对存储的数据进行备份,而是把数据和相对应的奇偶校验信息存储到组成RAID 5的各个磁盘上,并且奇偶校验信息和相对应的数据分别存储于不同的磁盘上。当RAID 5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。RAID 5可以理解为是RAID 0和RAID 1的折中方案。RAID 5可以为系统提供数据安全保障,但保障程度要比镜像低而磁盘空间利用率要比镜像高。RAID 5具有和RAID 0相近似的数据读取速度,只是多了一个奇偶校验信息,写入数据的速度相当慢,若使用Write Back可以让性能改善不少。同时,由于多个数据对应一个奇偶校验信息,RAID 5的磁盘空间利用率要比RAID 1高,存储成本相对较低。RAID 5的结构如图9-6所示。

RAID 10和RAID 01

RAID 10是先镜像再分区数据,将所有硬盘分为两组,视为RAID 0的最低组合,然后将这两组各自视为RAID 1运作。RAID 10有着不错的读取速度,而且拥有比RAID 0更高的数据保护性。RAID 01则与RAID 10的程序相反,先分区再将数据镜射到两组硬盘。RAID 01将所有的硬盘分为两组,变成RAID 1的最低组合,而将两组硬盘各自视为RAID 0运作。RAID 01比RAID 10有着更快的读写速度,不过也多了一些会让整个硬盘组停止运转的几率,因为只要同一组的硬盘全部损毁,RAID 01就会停止运作,而RAID 10可以在牺牲RAID 0的优势下正常运作。RAID 10巧妙地利用了RAID 0的速度及RAID 1的安全(保护)两种特性,它的缺点是需要较多的硬盘,因为至少必须拥有四个以上的偶数硬盘才能使用。RAID 10和RAID 01的结构如图9-7所示。

RAID 50

RAID 50也被称为镜像阵列条带由至少六块硬盘组成,像RAID 0一样,数据被分区成条带,在同一时间内向多块磁盘写入;像RAID 5一样,也是以数据的校验位来保证数据的安全,且校验条带均匀分布在各个磁盘上,其目的在于提高RAID 5的读写性能。

对于数据库应用来说,RAID 10是最好的选择,它同时兼顾了RAID 1和RAID 0的特性。但是,当一个磁盘失效时,性能可能会受到很大的影响,因为条带(strip)会成为瓶颈。曾在生产环境下遇到过的情况是,两台负载基本相同的数据库,一台正常的服务器磁盘IO负载为20%左右,而另一台服务器IO负载却高达90%。

9.4.2 RAID Write Back功能

RAID Write Back功能是指RAID控制器能够将写入的数据放入自身的缓存中,并把它们安排到后面再执行。这样做的好处是,不用等待物理磁盘实际写入的完成,因此写入变得更快了。对于数据库来说,这显得十分重要。例如,对重做日志的写入,在将sync_binlog设为1的情况下二进制日志的写入、脏页的刷新等都可以使性能得到明显的提升。

但是,当操作系统或数据库关机时,Write Back功能可能会破坏数据库的数据。这是由于已经写入的数据库可能还在RAID卡的缓存中,数据可能并没有完全写入磁盘,而这时故障发生了。为了解决这个问题,目前大部分的硬件RAID卡都提供了电池备份单元(BBU,Battery Backup Unit),因此可以放心地开启Write Back的功能。

如果没有启用Write Back功能,那么在RAID卡设置中显示的就是Write Through。Write Through没有缓冲写入,因此写入性能可能不是很好,但它却是最安全的写入

即使用户开启了Write Back功能,RAID卡也可能只是在Write Through模式下工作。这是因为安全使用Write Back的前提是RAID卡有电池备份单元。为了确保电池的有效性,RAID卡会定期检查电池状态,并在电池电量不足时对其进行充电,在充电的这段时间内会将Write Back功能切换为最为安全的Write Through。

用户可以在没有电池备份单元的情况下强制启用Write Back功能,也可以在电池充电时强制使用Write Back功能,只是写入是不安全的。用户应该非常确信这点,否则不应该在没有电池备份单元的情况下启用Write Back。

在Write Through模式下,通过将参数innodb_flush_log_at_trx_commit设置为0也可以提高执行存储过程P的性能,这时只需要68秒了。因为,在此设置下,重做日志的写入不是发生在每次事务提交时,而是发生在后台master线程每秒钟自动刷新的时候,因此减少了物理磁盘的写入请求,所以执行速度也可以有明显的提高。

9.4.3 RAID配置工具

对RAID卡进行配置可以在服务器启动时进入一个类似于BIOS的配置界面,然后再对其进行各种设置。此外,很多厂商都开发了各种操作系统下的软件对RAID进行配置,如果用户使用的是LSI公司生产提供的RAID卡,则可以使用MegaCLI工具来进行配置。

9.5  操作系统的选择

Linux是MySQL数据库服务器中最常使用的操作系统。

在Windows操作系统下表名不区分大小写,而Linux操作系统却是大小写敏感的,这点在开发阶段需要特别注意。

64位的操作系统,必须使用64位的软件;

9.6  不同的文件系统对数据库性能的影响

DBA首先应该把更多的注意力放到数据库上,而不是纠结于文件系统。

9.7  选择合适的基准测试工具

基准测试工具可以用来对数据库或操作系统调优后的性能进行对比。MySQL数据库本身提供了一些比较优秀的工具,这里将介绍另外两款更为优秀和常用的基准测试工具:sysbench和mysql-tpcc。

9.7.1 sysbench

sysbench是一个模块化的、跨平台的多线程基准测试工具,主要用于测试各种不同系统参数下的数据库负载情况。它主要包括以下几种测试方式:

CPU性能

磁盘IO性能

调度程序性能

内存分配及传输速度

POSIX线程性能

数据库OLTP基准测试

sysbench的数据库OLTP测试支持MySQL、PostgreSQL和Oracle。目前sysbench主要用于Linux操作系统,开源社区已经将sysbench移植到Windows,并支持对Microsoft SQL Server数据库的测试。

sysbench的官网地址是:http://sysbench.sourceforge.net,可以从该地址下载最新版本的sysbench工具,然后进行编译和安装。

对于InnoDB存储引擎的数据库应用来说,用户可能更关心磁盘和OLTP的性能,因此主要测试fileio和oltp这两个项目;

对于磁盘的测试,sysbench提供了以下的测试选项:

sysbench --test=fileio help

各个参数的含义如下:

--file-num,生成测试文件的数量,默认为128。

--file-block-size,测试期间文件块的大小,如果想知道磁盘针对InnoDB存储引擎进行的测试,可以将其设置为16384,即InnoDB存储引擎页的大小。默认为16384。

--file-total-size,每个文件的大小,默认为2GB。

--file-test-mode,文件测试模式,包含seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)和rndrw(随机读写)。

--file-io-mode,文件操作的模式,同步还是异步,或者是选择MMAP(map映射)模式。默认为同步。

--file-extra-flags,打开文件时的选项,这是与API相关的参数。

--file-fsync-freq,执行fsync函数的频率。fsync主要是同步磁盘文件,因为可能有系统和磁盘缓冲的关系。

--file-fsync-all,每执行完一次写操作,就执行一次fsync。默认为off。

--file-fsync-end,在测试结束时,执行fsync。默认为on。

--file-fsync-mode,文件同步函数的选择,同样是和API相关的参数,由于多个操作系统对fdatasync支持的不同,因此不建议使用fdatasync。默认为fsync。

--file-rw-ratio,测试时的读写比例,默认是2∶1。

sysbench的fileio测试需要经过prepare、run和cleanup三个阶段。prepare是准备阶段,生产需要的测试文件,run是实际测试阶段,cleanup是清理测试产生的文件。例如进行16个文件、总大小2GB的fileio测试:

sysbench --test=fileio--file-num=16--file-total-size=2G

9.7.2 mysql-tpcc

TPC-C的性能度量单位是tpmC,tpm是transaction per minute的缩写,C代表TPC的C基准测试。该值越大,代表事务处理的性能越高。

tpcc-mysql是开源的TPC-C测试工具,该测试工具完全遵守TPC-C的标准。其官方网站为:https://code.launchpad.net/~percona-dev/perconatools/tpcc-mysql。之前tpcc-mysql主要工作在Linux操作系统上,我已经将其移植到了Windows平台,可以在http://code.google.com/p/david-mysql-tools/downloads/list下载到Windows版本的tpcc-mysql。

tpcc-mysql由以下两个工具组成。

tpcc_load:根据仓库数量,生成9张表中的数据。

tpcc_start:根据不同选项进行TPC-C测试。

9.8  小结

在这一章中我们根据InnoDB存储引擎的应用特点对CPU、内存、硬盘、固态硬盘、RAID卡做了详细的介绍,相信只有通过理解InnoDB存储引擎的应用场合和范围才能更好地对其进行调优。最后,介绍了两个在Linux操作系统平台下常用的基准测试工具sysbench和tpcc-mysql,借助这两个工具可以更有效地得知当前系统的负载承受能力,以及对MySQL数据库的调优结果进行分析。

原文地址:https://www.cnblogs.com/coloz/p/13792694.html