MySQL 所在服务器使用命令iostat -xd 1
查看,其中一个盘的 %uitl 一直在 80%,但是读写速率又不高,写延迟也不大。
虽然 util 只是代表了繁忙程度,并不能直接代表硬盘的性能。但是看着数值这么高,不顺心,并且报警也会一直有。所以进行了分析处理
从 iostat 上看,读速率几乎为 0,写 4MB+/s(磁盘最高支持最高 350MB/s),iops 也只有 600 多,远没有达到磁盘 11,800 的上限。
怀疑两个问题
- update、insert 任务太多,导致写请求分散
- binlog 写频率过高
针对问题 1 修改了 innodb_io_capacity(变量定义了InnoDB后台任务每秒可用的 IOPS 数量,默认是 200)和 innodb_io_capacity_max (默认 2000)
SET GLOBAL innodb_io_capacity = 5000;
SET GLOBAL innodb_io_capacity_max = 8000;
修改后没有效果。
然后针对问题 2 ,修改了
sync_binlog
用来配置合并多少条binlog一次性写入磁盘,默认为 1
set global sync_binlog=50;
修改完毕之后 磁盘IO使用率马上降了下来。可以确定是由于多个事务同时提交,导致刷新 binlog 造成的IO使用率过高。
但是目前的修改有个风险是如果服务器宕机,从库会丢失部分数据。算是安全和性能的取舍了。