MySQL学习笔记(21):优化磁盘IO
本文更新于2020-04-05,使用MySQL 5.7,操作系统为Deepin 15.4。
目录
- 使用符号连接分布IO
- 禁止操作系统更新文件的atime属性
- 用裸设备(Raw Device)存放InnoDB共享表空间
- 调整IO调度算法
- 使用磁盘阵列(RAID)
- RAID卡电池充放电问题
- NUMA架构优化
使用符号连接分布IO
利用操作系统的符号连接,将不同的数据库、表、索引指向不同的物理磁盘,从而达到分布磁盘IO的目的。
禁止操作系统更新文件的atime属性
对于读写频繁的数据库文件来说,记录文件的访问时间一般没有用处,却会增加磁盘的负担,影响IO性能。
用裸设备(Raw Device)存放InnoDB共享表空间
因InnoDB使用缓存机制来缓存索引和数据,操作系统的磁盘IO缓存对其性能不仅没有帮助,甚至还有反作用。在InnoDB缓存充足的情况下,可以考虑使用裸设备来存放共享表空间。
调整IO调度算法
Linux实现了4中IO调度算法:
- NOOP算法(No Operation):不对IO请求排序,除了合并请求也不会进行其他任何优化,用最简单的先进先出FIFO队列顺序提交IO请求。NOOP算法主要面向随机访问设备,如SSD。
- 最后期限算法(Deadline):除了维护一个拥有合并和排序功能的请求队列外,额外维护两个带有超时的FIFO队列,分别是读请求队列和写请求队列。当调度器发现读/写请求队列中的请求超时,会优先处理这些请求。
- 预期算法(Anticipatory):是基于预测的IO算法,和Deadline类似,也维护了三个请求队列。区别在于,Anticipatory处理完一个IO请求后并不会直接返回处理下一个请求,而是等待片刻(默认6ms),等待期间如果有新来的相邻扇区的请求,会直接处理新来的请求。Anticipatory适合写入较多的环境,不适合数据库等随机读较多的环境。
- 完全公平队列(Complete Fair Queuing/CFQ):把IO请求按照进程分别放入进程对应的队列中,其公平是针对进程而言的。CFQ以时间片算法为前提,轮转调动队列。
建议MySQL数据库环境设置为Deadline算法。
使用磁盘阵列(RAID)
RAID(Redundant Array of Inexpensive Disks),即廉价磁盘冗余阵列,通常叫做磁盘阵列。
RAID级别:
- RAID0:也叫条带化。
- RAID1:也叫磁盘镜像。
- RAID10:先做磁盘镜像,再条带化。
- RAID4:像RAID0一样条带化,但额外增加一个磁盘用于纠错。
- RAID5:对RAID4的改进,但将纠错数据也分别写到各个磁盘而不是一个磁盘。
RAID卡电池充放电问题
RAID卡都有写缓存(Battery Backed Write Cache),写缓存对IO性能的提升非常明显。为了避免掉电丢失写缓存中的数据,RAID卡都有电池(Battery Backup Unit,简称BBU)。
RAID缓存策略包括4部分:
- 写策略
- WriteBack:将数据写入缓存后直接返回。
- WriteThrough:不使用写缓存,直接写入磁盘才返回。
- 预读策略
- ReadAheadNone:不开启预读。
- ReadAhead:开启预读,预先把后面的数据加载入缓存。
- ReadAdaptive:自适应预读,在缓存和I/O空闲的时候进行预读。
- 读策略
- Direct:读操作不进行缓存。
- Cached:读操作进行缓存。
- 故障策略
- Write Cache OK if Bad BBU:如果BBU出问题,不使用写缓存,从WriteBack自动切换到WriteThrough。
- No Write Cache if Bad BBU:如果BBU出问题,仍然使用写缓存。
RAID卡电池会定期启动自动校准模式,即定期充放电。期间,RAID卡控制器不会启动BBU。同时(除非修改缓存策略),也会禁用WriteBack写缓存策略,以保证数据完整性,造成系统IO性能会出现较大波动。
解决方案:
- 根据RAID卡电池下次充放电的时间,在业务量较低的时候,提前进行充放电。
- 即使电池电量低于警戒值甚至电池放电完毕,强制使用WriteBack写缓存策略。此时一定要有UPS之类的后备电源。
NUMA架构优化
目前的商用服务器系统架构大体分为三类(一般SMP或NUMA较多):
- 对称多处理器架构(SMP/Symmetric Multi-Processor):一台计算机上汇集了一组CPU,各CPU平等地共享内存、IO等资源。SMP也被称为一致存储访问架构(UMA/Uniform Memory Access)。由于共享,导致SMP服务器的扩展能力非常有限,最受限制的是内存,因每个CPU必需通过相同的总线访问相同的内存资源。
- 非一致存储访问架构(NUMA/Non-Uniform Memory Access):一台计算机分为多个节点,每个节点内部拥有多个CPU,节点内部使用共有的内存控制器,节点之间通过互联模块进行连接和信息交互。节点的所有内存对于本节点的所有CPU都是等同的,对于其他节点的所有CPU都是不同的。每个CPU都可以访问整个系统的内存,但访问本地节点的较快,访问非本地节点的较慢。因此,随着CPU数量的增加,系统性能并不能线性增加。
- 海量并行处理架构(MPP/Massive Parallel Processing):由多个SMP服务器通过一定的节点互联网络进行连接,每个节点只访问本地资源,不访问其他节点的资源。因而,理论上可以无限扩展。
NUMA的内存分配策略有4种:
- 缺省default:总是在当前进程运行的本地节点分配。其节点之间内存分配不均衡,当某个CPU节点内存不足时,会导致swap产生。
- 绑定bind:强制分配到指定节点上。
- 交叉interleave:在所有节点或指定节点上交叉分配内存。
- 优先preferred:在指定节点上分配,失败则在其他节点上分配。
MySQL对NUMA特性支持不好。
以上是 MySQL学习笔记(21):优化磁盘IO 的全部内容, 来源链接: utcz.com/z/534720.html