周末在一台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刷新脏页造成IO不足的警告。

page_cleaner超时只是果,而不是因,一个果可能是有不同的因造成的,具体原因在哪里?
逐步反推这个过程:单次刷新内存数据到磁盘的数量过大<----LRU刷新或者脏页刷刷新<------大批量读写数据(LRU)或者删除出数据(delete,drop等等))。
另外一个原因(删除数据造成的page_cleaner超时)参考:https://www.cnblogs.com/wy123/p/11763293.html

MySQL在正常运行时4个与IO写入(checkpoint)相关的参数,然后逐一分析其写入的时机和内存页面的数量。

1,innodb_io_capacity

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

那么master thread中定时循环刷新脏页的数据是多少?由参数innodb_io_capacity决定,以下截图自《MySQL技术内幕InnoDB存储引擎》page 41

2,innodb_max_dirty_pages_pct

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

这种情况下刷新的“部分”脏页,到底是刷新多少个脏页?
因为没有阅读源码的能力,从这里来看(后面会给出参考链接),这个值是依旧是innodb_io_capacity个脏页。

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

3,innodb_lru_scan_depth

lru列表中保持空闲page的数据量,如果低于这个数量,则按照LRU的原则刷新脏页到磁盘。
这种情况下是刷线多少个脏页?
(20190906补充:这句话是有问题的的,LRU的刷新跟脏页是没有必然关系,LRU只是脏冷数据从bufferpool中移除掉)LRU只关心页的冷热程度,而不关系页是否为脏页。
此情况下触发,默认扫描innodb_lru_scan_depth个lru冷端数据页,将脏页(扫描到的innodb_lru_scan_depth个冷数据页面中,如果是脏页的话)写入磁盘(有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写入瓶颈的警告分析的更多相关文章

  1. 谁记录了mysql error log中的超长信息

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

  2. 谁记录了mysql error log中的超长信息(记pt-stalk一个bug的定位过程)

    [问题] 最近查看MySQL的error log文件时,发现有很多服务器的文件中有大量的如下日志,内容很长(大小在200K左右),从记录的内容看,并没有明显的异常信息. 有一台测试服务器也有类似的问题 ...

  3. Sort aborted Error in MySQL Error Log

    现象 [ERROR] lines containing "Sort aborted" are present in the MySQL error log file. [Warni ...

  4. MySQL Error Log 文件丢失导致The server quit without updating PID file启动失败的场景

    今天在做mysql sniff测试的时候,中间重启MySQL实例的过程中,出现了"The server quit without updating PID file"这个经典的错误 ...

  5. Linux中IO监控命令的使用分析

    一篇不错的有关linux io监控命令的介绍和使用. 1.系统级IO监控 iostat iostat -xdm 1    # 个人习惯 %util         代表磁盘繁忙程度.100% 表示磁盘 ...

  6. 【MySQL案例】error.log的Warning:If a crash happens thisconfiguration does not guarantee that the relay lo(转)

    标签: 1.1.1. If a crash happens thisconfiguration does not guarantee that the relay log info will be c ...

  7. 【MySQL案例】error.log的Warning:If a crash happens thisconfiguration does not guarantee that the relay lo

    1.1.1. If a crash happens thisconfiguration does not guarantee that the relay log info will be consi ...

  8. MySQL错误日志(Error Log)

    错误日志是一个文本文件,记录了 MySQL Server 每次启动和关闭的详细信息以及运行过程中所有较为严重的警告和错误信息.在遇到问题时,应该首先查看这个文件. 如何开启 使用命令 SHOW VAR ...

  9. mysql ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

    为了加强安全性,MySQL5.7为root用户随机生成了一个密码,在error log中,关于error log的位置,如果安装的是RPM包,则默认是/var/log/mysqld.log. 一般可通 ...

随机推荐

  1. Bomb后端云使用

    Bomb是后台云托管工具,在Bomb官网注册会员,即可免费使用后台数据库服务.https://www.bmob.cn/app/list 创建应用后,在设置里获取密钥.根据官方文档集成. 在集成后运行时 ...

  2. 新更新的OV7670 OV7725模块效果展示 OV7670 FPC版 30万像素 CMOS模块 兼容官哥方便 FPGA stm32f407 68013等使用

    原创OV7670,30W像素摄像头模块, 3) 光学尺寸1/6 ,像素面积3.6 μm x 3.6 μm,灵敏度1.3V/Lux-sec 4) 工作电压:3.3V 5) 接口定义为10*2的2.54间 ...

  3. Python3 并发编程3

    目录 GIL全局解释器锁 基本概念 多线程的作用 死锁现象 递归锁 信号量 线程队列 GIL全局解释器锁 基本概念 global interpreter lock 全局解释器锁 GIL不是Python ...

  4. Nginx(二)--nginx的核心功能

    反向代理 nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理. proxy_pass 既可以是ip地址,也可以是域名,同时还可以指定端 ...

  5. 一篇文章看清楚JDK13的特性!

    1.switch优化更新 JDK11以及之前的版本: switch (day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println( ...

  6. c语言输入矩阵的对角线之和

    一.程序代码如下 #include<stdio.h> #define M 4 main() { int matrix[][M]={ {1,2,4,5},{2,6,6,7},{8,7,6,5 ...

  7. 使用t-SNE做降维可视化

    最近在做一个深度学习分类项目,想看看训练集数据的分布情况,但由于数据本身维度接近100,不能直观的可视化展示,所以就对降维可视化做了一些粗略的了解以便能在低维空间中近似展示高维数据的分布情况,以下内容 ...

  8. 【CV现状-3.0】"目标"是什么

    #磨染的初心--计算机视觉的现状 [这一系列文章是关于计算机视觉的反思,希望能引起一些人的共鸣.可以随意传播,随意喷.所涉及的内容过多,将按如下内容划分章节.已经完成的会逐渐加上链接.] 缘起 三维感 ...

  9. Vue增强

    1. Vue事件 语法:使用v-on指令注册事件 <标签 v-on:事件句柄="表达式或者事件处理函数"></标签> 简写方式:<标签 @事件句柄=& ...

  10. jQuery实现简单购物车页面

    功能描述: 当全选按钮被按下时,所有商品的小复选框(以及另外一个全选按钮)的选中状态跟按下的全选按钮保持一致: 当用户选中商品时,如果所有商品都被选中,就让全选按钮为选中状态: 用户可以点击 + - ...