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