MySQL数据库在IO性能优化⽅⾯的设置选择(硬件)
提起MySQL数据库在硬件⽅⾯的优化⽆⾮是CPU、内存和IO。下⾯我们着重梳理⼀下关于磁盘I/O⽅⾯的优化。
1.磁盘冗余阵列RAID
RAID(Redundant Array of Inexpensive Disk)的基本⽬的是把⼩型廉价的硬盘合并成⼀块⼤容量的硬盘,⽤于解决数据冗余性并降低成本,且提⾼数据处理性能。
1.1 RAID的优点
RAID的优点可以从⾼传输速率和容错两⽅⾯来阐述:
(1)提⾼传输速率。RAID通过在多个磁盘上同时存储和读取数据来⼤幅提⾼存储系统的数据吞吐量(Throughput)。在RAID中,可以让很多磁盘驱动器同时传输数据,⽽这些磁盘驱动器在逻辑上⼜是⼀个磁盘驱动器,所以使⽤RAID可以达到单个磁盘驱动器⼏倍、⼏⼗倍甚⾄上百倍的速率。这也是RAID最初想要解决的问题。因为当时CPU的速度增长很快,⽽磁盘驱动器的数据传输速率⽆法⼤幅提⾼,所以需要有⼀种⽅案解决⼆者之间的⽭盾。
(2)通过数据校验提供容错功能。普通磁盘驱动器⽆法提供容错功能,如果不包括写在磁盘上的CRC(循环冗余校验)码的话。RAID容错是建⽴在每个磁盘驱动器的硬件容错功能之上的,所以它提供更⾼的安全性。在很多RAID模式中都有较为完备的相互校验/恢复的措施,甚⾄是直接相互的镜像备份,从⽽⼤⼤提⾼了RAID系统的容错度,提⾼了系统的稳定冗余性。
1.2RAID常见类别
RAID0 数据在从内存缓冲区写⼊磁盘时,根据磁盘数量将数据分成N份,这些数据同时并发写⼊N块磁盘,使得数据整体写⼊速度是⼀块磁盘的N倍。读取时也是⼀样的。因此RAID0具有极快的数据读写速度。但是RAID0不做数据冗余,N块磁盘中只要⼀块损坏,数据完整性就被破坏,所有的数据都会损坏,即任何⼀块硬盘的损坏都将导致数据的丢失。
RAID1 数据在写⼊磁盘时,将⼀份数据同时写⼊两块磁盘,这样任何⼀块磁盘损坏都不会导致数据丢
失,插⼊⼀块新磁盘就可以通过复制数据的⽅式⾃动修复,具有极⾼的可靠性。但对应的存储能⼒有所降低,如两块相同硬盘组成的RAID1,则容量为其中⼀块硬盘的⼤⼩,即磁盘利⽤率为50%。
RAID5 RAID5也是⼀种普遍使⽤的RAID类型,是⼀种存储性能、数据安全和存储成本兼顾的存储解决⽅案。磁盘空间利⽤率要⽐RAID1⾼,存储成本相对较低。RAID5 和RAID4、RAID3相⽐,校验数据分布在阵列中的所有磁盘上,⽽没有采⽤专门的校验磁盘。对于数据和校验数据,它们的写操作可以同时发⽣在完全不同的磁盘上。因此, RAID5 不存在 RAID4 中的并发写操作时的校验盘性能瓶颈问题。另外, RAID5 还具备很好的扩展性。当阵列磁盘 数量增加时,并⾏操作量的能⼒也随之增长,可⽐ RAID4 ⽀持更多的磁盘,从⽽拥有更⾼的容量以及更⾼的性能。RAID5 的磁盘上同时存储数据和校验数据,数据块和对应的校验信息存保存在不同的磁盘上,当⼀个数据盘损坏时,系统可以
根据同⼀条带的其他数据块和对应的校验数据来重建损坏的数据。与其他 RAID 等级⼀样,重建数据时, RAID5 的性能会受到较⼤的影响。
说明:图中零散分布 A P B P C P D P 为校验数据
RAID10 结合RAID0和RAID1两种⽅案。Raid 10其实结构⾮常简单,⾸先创建2个独⽴的Raid1,然后将这两个独⽴的Raid1组成⼀个Raid0,当往这个逻辑Raid中写数据时,数据被有序的写⼊两个Raid1中。磁盘1和磁盘2组成⼀个Raid1,磁盘3和磁盘4⼜组成另外⼀个Raid1;这两个Raid1组成了⼀个新的Raid0。如写在硬盘1上的数据0、2、4、6 写在硬盘2中则为数据0、2、4、6,硬盘3中的数据为1、3、5、7,硬盘4中的数据则为1、3、5、7,因此数据在这四个硬盘上组合成Raid10,且具有raid0和raid1两者的特性。虽然
Raid10⽅案造成了50%的磁盘浪费,但是它提供了200%的速度和单磁盘损坏的数据安全性,并且当同时损坏的磁盘不在同⼀Raid1中,就能保证数据安全性。假如磁盘中的某⼀块盘坏了,整个逻辑磁盘仍能正常⼯作的。 当我们需要恢复RAID 10中损坏的磁盘时,只需要更换新的硬盘,按照RAID10的⼯作原理来进⾏数据恢复,恢复数据过程中系统仍能正常⼯作。原先的数据会同步恢复到更换的硬盘中。
1.3 总结
为数据库服务器配置RAID的时候,建议采⽤RAID10配置,尽管RAID10会更浪费空间,但它提供了更好的性能。直观地将,采⽤RAID5时,由于需要更新校验数据信息,所以每写⼀次数据,都需要读取数据奇偶信息,经过计算后,再更新校验数据,让后再写⼊实际数据,⽽RAID10则是直接写⼊数据。
2. 尽可能地使⽤SSD硬盘
SSD(Solid State Disk 或 Solid State Drive 固态硬盘)是⼀种基于永久性存储器的计算机外部存储设备。
与传统磁盘相⽐,其性能⾮常惊艳。
特点数据对⽐
⾼IOPS IOPS 即1秒内能够完成的读写次数,是存储性能的最直接的表现。传统磁盘每秒差不多可以完成200次IO请求,⽽SSD每秒钟可以⾼达60万次。
低延迟低延迟 即主机下达存储指令后,存储介质完成存储并返回正确应答的时间。传统磁盘由于驱动马达转动盘⽚和摇动磁头⼿臂,完成单个IO 需要2000微妙左右,⽽SSD只需要不到100微妙。
低功耗如果使⽤传统的磁盘来创建接近SSD性能的磁盘阵列总功耗⾼达⼏百到上千⽡;⽽⼀块PCIe SSD的功耗不会超过25⽡。
⼤容量传统磁盘容量在4TB以下,并且增长困难,⽽PCIe SSD已有单盘 12.8TB的容量,并且增长趋势可期。
故障率低且可预
测
传统磁盘由于是机械部件,故障不可预测,年故障率在百分之三左右,⽽SSD的故障可以预测,年故障率在千分之五以内。
抗震能⼒强,且
⽆噪⾳
传统磁盘是机械旋转设备,对震动敏感,甚⾄引发磁盘停转,同时马达也会发出噪⾳;⽽SSD完全是电⼦元件,抗震能⼒强,且不噪声。
3 IO调度策略--SSD推荐设置为noop,SATA为deadline
3.1 IO调度器
每个块设备或者块设备的分区,都对应有⾃⾝的请求队列(request_queue),⽽每个请求队列都可以选择⼀个I/O调度器来协调所递交
的request。I/O调度器的基本⽬的是将请求按照它们对应在块设备上的扇区号进⾏排列,以减少磁头的移动,提⾼效率。每个设备的请
求队列⾥的请求将按顺序被响应。实际上,除了这个队列,每个调度器⾃⾝都维护有不同数量的队列,⽤来对递交上来的request进⾏处理,⽽排在队列最前⾯的request将适时被移动到请求队列中等待响应。
IO调度器在内核栈中所处位置如下:
3.2 调度算法
内核中实现的IO调度器主要有四种--Noop,Deadline,CFG, Anticipatory。
如果简单概括总结的的话:1.NOOP 先进先出 2.Deadline 截⽌时间调度程序 3.CFQ 完全公平排队I/O调度程序 4.AS(预料I/O调度程序) .
Noop调度算法是内核中最简单的IO调度算法。Noop调度算法也叫作电梯调度算法,它将IO请求放⼊到⼀个FIFO队列中,然后逐个执⾏这些IO请求,当然对于⼀些在磁盘上连续的IO请求,Noop算法会适当做⼀些合并。这个调度算法特别适合那些不希望调度器重新组织IO请求顺序的应⽤。
Deadline算法的核⼼在于保证每个IO请求在⼀定的时间内⼀定要被服务到,以此来避免某个请求饥饿。
CFQ(Completely Fair Queuing)算法,顾名思义,绝对公平算法。它试图为竞争块设备使⽤权的所有进程分配⼀个请求队列和⼀个时间⽚,在调度器分配给进程的时间⽚内,进程可以将其读写请求发送给底层块设备,当进程的时间⽚消耗完,进程的请求队列将被挂起,等待调度。 每个进程的时间⽚和每个进程的队列长度取决于进程的IO优先级,每个进程都会有⼀个IO优先级,CFQ调度器将会将其作为考虑的因素之⼀,来确定该进程的请求队列何时可以获取块设备的使⽤权。
Anticipatory算法的核⼼是局部性原理,它期望⼀个进程做完⼀次IO请求后还会继续在此处做IO请求。在IO操作中,有⼀种现象叫“假空闲”(Deceptive idleness),它的意思是⼀个进程在刚刚做完⼀波读操作后,看似是空闲了,不读了,但是实际上它是在处理这些数据,处理完这些数据之后,它还会接着读,这个时候如果IO调度器去处理另外⼀个进程的请求,那么当原来的假空闲进程的下⼀个请求来的时候,磁头⼜得ek到刚才的位置,这样⼤⼤增加了寻道时间和磁头旋转时间。所以,Anticipatory算法会在⼀个读请求做完后,再等待⼀定时间t(通常是6ms),如果6ms内,这个进程上还有读请求过来,那么我继续服务,否则,处理下⼀个进程的读写请求。
对于⼀些⾮旋转磁头⽒的存储设备,使⽤Noop的效果更好。因为对于旋转磁头式的磁盘来说,IO调度器的请求重组要花费⼀定的CPU时间,但是对于SSD磁盘来说,这些重组IO请求的CPU时间可以节省下来,因为SSD提供了更智能的请求调度算法,不需要内核去画蛇添⾜。
3.3 性能对⽐
以下性能Report是在SSD存储介质下,各调度策略的性能表现。
通过数据对⽐,我们也可以发现:SSD推荐设置为noop。
4.其它的注意事项
例如:进程打开⽂件数:65535 ;⽂件系统:选XFS(centos7已经默认是XFS了)等等。
参考⽂献:
2.《MySQL 运维内参》
3. ⽹络分享
本⽂版权归作者所有,未经作者同意不得转载,谢谢配合