当前位置: 首页 > 面试题库 >

如何解决mysql警告:“ InnoDB:page_cleaner:1000毫秒的预期循环用了XXX毫秒。设置可能不是最佳的”?

上官兴昌
2023-03-14
问题内容

我在服务器上运行了mysql import mysql dummyctrad
<dumpfile.sql,它花了太长时间才能完成。转储文件约为5G。该服务器是Centos 6,内存= 16G和8核处理器,mysql v 5.7
x64-

这些是正常消息/状态“正在等待表刷新”吗? InnoDB: page_cleaner: 1000ms intended loop took 4013ms. The settings might not be optimal

html" target="_blank">mysql日志内容

2016-12-13T10:51:39.909382Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 4013ms. The settings might not be optimal. (flushed=1438 and evicted=0, during the time.)
2016-12-13T10:53:01.170388Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 4055ms. The settings might not be optimal. (flushed=1412 and evicted=0, during the time.)
2016-12-13T11:07:11.728812Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 4008ms. The settings might not be optimal. (flushed=1414 and evicted=0, during the time.)
2016-12-13T11:39:54.257618Z 3274915 [Note] Aborted connection 3274915 to db: 'dummyctrad' user: 'root' host: 'localhost' (Got an error writing communication packets)

流程清单:

mysql> show processlist \G;
*************************** 1. row ***************************
     Id: 3273081
   User: root
   Host: localhost
     db: dummyctrad
Command: Field List
   Time: 7580
  State: Waiting for table flush
   Info: 
*************************** 2. row ***************************
     Id: 3274915
   User: root
   Host: localhost
     db: dummyctrad
Command: Query
   Time: 2
  State: update
   Info: INSERT INTO `radacct` VALUES (351318325,'kxid ge:7186','abcxyz5976c','user100
*************************** 3. row ***************************
     Id: 3291591
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: starting
   Info: show processlist
*************************** 4. row ***************************
     Id: 3291657
   User: remoteuser
   Host: portal.example.com:32800
     db: ctradius
Command: Sleep
   Time: 2
  State: 
   Info: NULL
4 rows in set (0.00 sec)

更新1

mysqlforum,innodb_lru_scan_depth

将innodb_lru_scan_depth值更改为256可改善插入查询的执行时间+日志中无警告消息,默认值为innodb_lru_scan_depth =
1024;

SET GLOBAL innodb_lru_scan_depth=256;


问题答案:

InnoDB:page_cleaner:1000毫秒的预期循环耗时4013毫秒。设置可能不是最佳的。(在这段时间内刷新为1438,逐出为0)。

这个问题是典型的MySQL实例,其中您对数据库的更改率很高。通过运行5GB导入,您可以快速创建脏页。创建脏页时,页面清除器线程负责将脏页从内存复制到磁盘。

就您而言,我假设您并非一直都导入5GB。因此,这是非常高的数据负载率,而且是暂时的。您可能会忽略警告,因为InnoDB会逐渐赶上。

这是导致此警告的内部原因的详细说明。

每秒一次,页面清理程序扫描缓冲池中是否有脏页,以将其从缓冲池刷新到磁盘。您看到的警告表明它有很多脏页要刷新,并且需要花费4秒多的时间将一批脏页刷新到磁盘上,而这应该在1秒内完成。换句话说,它咬的东西超过了它的咀嚼能力。

您通过将它innodb_lru_scan_depth从1024 减少到256
进行了调整。这减少了页面清洁器线程在每秒一次的循环中搜索脏页到缓冲池的距离。您要求它咬一点。

请注意,如果您有许多缓冲池实例,它将导致刷新工作更多。它innodb_lru_scan_depth减少了每个缓冲池实例的工作量。因此,您可能在不减小扫描深度的情况下无意中通过增加了缓冲池的数量而导致了该瓶颈。

的文档innodb_lru_scan_depth说:“小于默认设置通常适用于大多数工作负载。” 听起来他们给此选项的默认值太高。

您可以使用innodb_io_capacityinnodb_io_capacity_max选项来限制后台冲洗使用的IOPS
。第一个选项是InnoDB将请求的I /
O吞吐量的软限制。但是这个限制是灵活的。如果刷新落后于新的脏页创建速度,则InnoDB将动态增加刷新率,使其超过此限制。第二个选项对InnoDB可能增加刷新率的范围进行了更严格的限制。

如果刷新率能跟上创建新脏页的平均率,那么您会没事的。但是,如果您始终以比刷新它们快的速度创建脏页,则最终您的缓冲池将充满脏页,直到脏页超出innodb_max_dirty_page_pct缓冲池为止。此时,刷新率将自动增加,并可能再次导致page_cleaner发送警告。

另一个解决方案是将MySQL放在具有更快磁盘的服务器上。您需要一个I / O系统,该系统可以处理页面刷新所需的吞吐量。

如果您始终在平均流量下看到此警告,则可能是您尝试在此MySQL服务器上执行太多写查询。现在可能是横向扩展并将写入分成多个MySQL实例的时候了,每个实例都有自己的磁盘系统。

了解有关页面清洁器的更多信息:

  • 在InnoDB中引入page_cleaner线程(归档副本)
  • MySQL-5.7改善了面向DML的工作负载


 类似资料:
  • 问题内容: 我正在编写一个赛车应用程序,想要将大量毫秒转换为minutes:seconds.milliseconds(例如)。目前,我只是通过数学()进行运算,然后求余数并进一步除法,依此类推,但是我发现它时不时关闭1毫秒。我知道这听起来似乎没什么大不了的,但是我试图找到和的平均值,然后返回,这意味着它输入不正确,而应用程序的其余部分无法处理。 有没有一种方法使用或格式化毫秒到MM或类似的东西:s

  • 问题内容: java函数System。 currentTimeMillis ()显然返回自1970年1月1日以来的秒数。但是,根据Wikipedia.org/wiki/Leap_second的说法,自1972年以来已经有25个leap秒。这意味着自1970年1月1日以来的实际秒数比单纯的计算所建议的秒数多25。是否系统。 currentTimeMillis ()会天真的计算而忽略the秒吗? 问题

  • 问题内容: 我想放 当我使用JavaScript实现回调函数时,此代码。 但是我发现现代的浏览器和一些旧的浏览器 具有不同的最小超时值。 我知道零不能是最小值。 setTimeout的最小值是多少 现代浏览器和某些旧版浏览器是否存在兼容性问题? 问题答案: 我认为10是所有浏览器中最可靠的最小值,因为我已经看到很多使用它的代码。 但是,HTML5最少需要4毫秒 实际上,HTML5规范指定了4毫秒,

  • 问题内容: 在pandas数据框中有一个datetime列,其值如下: 我想知道如何舍入这些值,摆脱毫秒,仅将日期,小时,分钟和00表示为秒,如下所示: 问题答案: 使用与用于分钟设置: 我想将时间值更改为下一个值:

  • 问题内容: 我做了一些研究,但仍然找不到如何得到的日子…这是我得到的: 请帮助,我在数学上很烂,谢谢。 问题答案: 如果您没有另一个大于天的时间间隔: 如果您还有几个星期: 如果可能的话,最好避免使用几个月和几年,因为它们没有明确定义的固定长度。严格来说,两天都没有:夏令时意味着天的长度可以不是24小时。

  • 问题内容: 我正在尝试定义一个接口,以在其中绘制外部设备接收到的一些值。这些值以可以通过接口设置的频率接收。当然,绘图的周期应根据用户定义的周期而改变。因此,我开始定义followint图表: 是下面的类,如此处所示: 是以下类别: 我通过以下方式将样本添加到系列中: 我期望的是,一旦将周期固定为200毫秒,图表就会在X标签上报告大约5个时间值: 我希望每个“空间”中有25个样本。 相反,发生的是