SSD 下的 MySQL IO 优化尝试(2)

在 SSD 或者 Fusion IO,最简单的 NOOP 反而可能是最好的算法,因为其他三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且 I/O 响应时间非常短。

还是用数据说话吧,以下是 SSD 下针对不同 I/O 调度算法所做的 I/O 性能测试,均为 IOPS。

I/O TypeNOOPAnticipatoryDeadlineCFQ
Sequential Read   22256   7955   22467   8652  
Sequential Write   4090   2560   1370   1996  
Sequential RW Read   6355   760   567   1149  
Sequential RW Write   6360   760   565   1149  
Random Read   17905   20847   20930   20671  
Random Write   7423   8086   8113   8072  
Random RW Read   4994   5221   5316   5275  
Random RW Write   4991   5222   5321   5278  

可以看到,整体来说,NOOP 算法略胜于其他算法。

接下来讲解需要调整的 InnoDB 参数的含义:

innodb_log_file_size:InnoDB 日志文件的大小;

innodb_io_capacity:缓冲区刷新到磁盘时,刷新脏页数量;

innodb_max_dirty_pages_pct:控制了 Dirty Page 在 Buffer Pool 中所占的比率;

innodb_adaptive_flushing:自适应刷新脏页;

innodb_write_io_threads:InnoDB 使用后台线程处理数据页上写 I/O(输入)请求的数量;

innodb_read_io_threads:InnoDB 使用后台线程处理数据页上读 I/O(输出)请求的数量。

4、A 项目 MySQL 主从关系图

A 项目 MySQL 主从关系如图一:

Yzone


图一 A 项目 MySQL 主从关系图

Yzone

5、程序切换之前调优

程序切换之前,39 只是 24 的从库,所以 IO 压力不高,以下的调整也不能说明根本性的变化。需要说明一点,以下调整的平均间隔在 30 分钟左右。

5.1 修改系统 IO 调度算法

系统默认的 I/O 调度算法 是 CFQ,我们试图先修改之。至于为什么修改,可以查看第3节。

具体的做法如下,需要注意的是,请根据实际情况做调整,比如你的系统中磁盘很可能不是 sda。

echo "noop">/sys/block/sda/queue/scheduler

如果想永久生效,需要更改 /etc/grub.conf,添加 elevator,示例如下:

kernel /vmlinuz-x.x.xx-xxx.el6.x86_64 ro root=UUID=e01d6bb4-bd74-404f-855a-0f700fad4de0 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun1

6 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM elevator=noop rhgb quiet

此步调整做完以后,查看 39 I/O 状态,并没有显著的变化。

5.2 修改 innodb_io_capacity = 4000

在做这个参数调整之前,我们来看看当前 MySQL 的配置:

innodb_buffer_pool_size 42949672960

innodb_log_file_size 1342177280

innodb_io_capacity 200

innodb_max_dirty_pages_pct 30

innodb_adaptive_flushing ON

innodb_write_io_threads 4

innodb_read_io_threads 4

修改方法如下:

SET GLOBAL innodb_io_capacity =4000;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e3e8cc0cb55ae652e23854b0f668f4c9.html