MySQL学习笔记(21):优化磁盘IO

本文更新于2020-04-05,使用MySQL 5.7,操作系统为Deepin 15.4。

使用符号连接分布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特性支持不好。

posted @ 2020-07-20 19:28  garvenc  阅读(822)  评论(0编辑  收藏  举报