mysql 磁盘分区优化io_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特性支持不好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值