MySQL Error Log 中IO能力不足的警告分析

Posted wy123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL Error Log 中IO能力不足的警告分析相关的知识,希望对你有一定的参考价值。


周末在一台mysql实例上频繁做大批量的写入测试,无意中发现MySQL的errorlog中频繁出现如下的Note:
page_cleaner: 1000ms intended loop took **** ms. The settings might not be optimal. (flushed=**** and evicted=0, during the time.)

技术图片 

一个典型的信息如下
InnoDB: page_cleaner: 1000ms intended loop took 4068ms. The settings might not be optimal. (flushed=2000 and evicted=0, during the time.)
该告警意味着MySQL实例按照目前IO相关的参数配置的前提下,存在着IO写入性能上的瓶颈,配置参数与IO处理能力不匹配。
因为很清楚是在做测试的情况下,连续大批量写入数据造成的,很有可能是checkpoint刷新脏页造成的改警告。

 

MySQL在正常运行时4个与IO刷新相关的参数。

1,innodb_io_capacity

master thread中中每秒或者每10s循环中刷新脏页的数量

技术图片

刷新脏页的数据是多少?有参数innodb_io_capacity决定,以下截图自《MySQL技术内幕InnoDB存储引擎》page 41

技术图片


2,innodb_max_dirty_pages_pct

innodb buffer pool中脏页数量超过这个比例之后,刷新部分脏页到磁盘

技术图片

这种情况下是刷新多少个脏页?
因为没有阅读源码的能力,从这里来看(后面会给出参考链接),这个值是innodb_io_capacity个脏页。
技术图片

innodb_max_dirty_pages_pct这个参数本身默认值差不多就是最优化的,应该是不能瞎几把调的。以下截图自《MySQL技术内幕InnoDB存储引擎》page 42

技术图片

 

 

3,innodb_lru_scan_depth

lru列表中保持空闲page的数据量,如果低于这个数量,则按照LRU的原则刷新脏页到磁盘。
这种情况下是刷线多少个脏页?
此情况下触发,默认扫描innodb_lru_scan_depth个lru冷端数据页,将脏页写入磁盘(有10个就刷10,有100个就刷100个……)
这一点参考这个(笔者并没有找到确切的证据):https://www.cnblogs.com/geaozhang/p/7341333.html


4,redo log日志空间达到配置阈值的刷新(一个实例的redo log空间总和)

单个redo log大小的参数:innodb_log_file_size
redo log 个数:innodb_log_files_in_group 
async_water_mark   = 75%*innodb_log_file_size
sync_water_mark    = 90%*innodb_log_file_size
  1)当checkpoint_age<sync_water_mark的时候,无需执行Flush checkpoint。也就说,redo log剩余空间超过25%的时候,无需执行Async/Sync Flush checkpoint。
  2)当async_water_mark<checkpoint_age<sync_water_mark的时候,执行Async Flush checkpoint,也就说,redo log剩余空间不足25%,但是大于10%的时候,执行Async Flush checkpoint,刷新到满足条件1
  3)当checkpoint_age>sync_water_mark的时候,执行sync Flush checkpoint。也就说,redo log剩余空间不足10%的时候,执行Sync Flush checkpoint,刷新到满足条件1。

 技术图片

 

在buffer pool远没有达到分配值的情况下,innodb_max_dirty_pages_pct和innodb_lru_scan_depth也不会达到checkpoint的条件,redo log也没有切换,
因此只能断定为master thread 后台线程定时刷新脏页造成的IO负担过载,因此尝试 set global innodb_io_capacity = 1000;
经后继续测试观察,尚未发现类似新的page_cleaner告警日志产生。

 

 

参考:

http://blog.itpub.net/26506993/viewspace-2214703/

https://www.cnblogs.com/geaozhang/p/7341333.html

https://www.jianshu.com/p/6991304a8e26?tdsourcetag=s_pcqq_aiomsg

https://www.jianshu.com/p/ddb24f9afae0?tdsourcetag=s_pcqq_aiomsg

以上是关于MySQL Error Log 中IO能力不足的警告分析的主要内容,如果未能解决你的问题,请参考以下文章

MySQL案例09:Last_IO_Error: Got fatal error 1236 from master when reading data from binary log

mysql 启动失败

cactiez使用mysql数据库出现以下报错:“[ERROR] /usr/sbin/mysqld”

为啥 sizeof(IO_ERROR_LOG_PACKET) == 48 而不是 44? [复制]

Express JWT 错误:socket.io 初始身份验证中的段不足或过多

Got fatal error 1236 from master when reading data from binary log: 'Could not find first log fi