在 SSD 或者 Fusion IO,最简单的 NOOP 反而可能是最好的算法,因为其他三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且 I/O 响应时间非常短。
还是用数据说话吧,以下是 SSD 下针对不同 I/O 调度算法所做的 I/O 性能测试,均为 IOPS。
I/O TypeNOOPAnticipatoryDeadlineCFQSequential 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 主从关系如图一:
图一 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;