我运行了一个mysql导入mysql dummyctrad<转储文件.服务器上的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

mysql日志(log)内容

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)

Update-1

mysqlforum ,innodb_lru_scan_depth

将innodb_lru_scan_depth值更改为256提高了插入查询的执行时间+日志(log)中没有警告消息,默认值为innodb_lru_scan_depth=1024;

SET GLOBAL innodb_lru_scan_depth=256;

推荐答案

InnoDB:page_cleaner:1000ms预期循环耗时4013ms.设置可能不是最佳的.(在此期间,刷新=1438,驱逐=0.)

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

在你的情况下,我假设你不总是做5GB的导入.所以这是一个异常高的数据加载率,而且是暂时的.您可能可以忽略这些警告,因为InnoDB将逐渐跟上.


以下是导致此警告的内部原因的详细说明.

页面清理器每秒扫描一次缓冲池,以查找脏页,将其从缓冲池刷新到磁盘.您看到的警告显示,它有很多脏页要刷新,将一批脏页刷新到磁盘需要4秒钟以上,而它应该在1秒钟内完成这项工作.换句话说,它咬的东西比它能嚼的还多.

您通过将innodb_lru_scan_depth从1024减少到256来进行调整.这减少了页面清理器线程在每秒一次的周期内搜索脏页时进入缓冲池的距离.你要求它吃小一点.

请注意,如果有多个缓冲池实例,则会导致刷新完成更多工作.它 for each 缓冲池实例节省了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页.此时,冲洗速度将自动增加,并可能再次导致页面清洁器发出警告.

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

如果你在平均流量下一直看到这个警告,你可能试图在这个MySQL服务器上执行太多的写查询.现在可能是时候扩大规模,将写操作拆分到多个MySQL实例上,每个实例都有自己的磁盘系统.

阅读有关页面清理器的更多信息:

Mysql相关问答推荐

SQL Store Procedure Throwing [42000][1064]您在EXECUTE stat USING声明上的SQL语法中有错误

MYSQL子查询

正在获取MySQL死锁,因为这个查询需要很长时间.

用于将具有多个状态更改日期列的单行转换为具有状态和时间戳的多行的SQL查询

Mysql-查找缺少列的表

Group_CONCAT CASE 乘法输出

看不懂mysql自左连接查询

Mysql根据文本语言或行数将列拆分为多列

从 R 脚本创建新的 MYSQL 数据库

如何使用 express.js 和 react.js 删除连接表中的元素和关联元素

使用 DISTINCT 时无法从数据库中查询所有数据

从 2 个不同的表中获取数据并将它们加入 sql

SQL 查找边界之间的值

如何将表的链接列转换为 SQL 中的行?

MySQL 5.6 DATETIME 不接受毫秒/微秒

PHP,MySQL 错误:列计数与第 1 行的值计数不匹配

MySQL INSERT IF(自定义 if 语句)

MySQL SELECT 增量计数器

将 mySQL 查询作为 cron 作业(job)运行?

如何在 MySQL 的日期时间字段中存储 NULL 值?