[Mysql] InnoDB:page_cleaner:1000ms intended loop took xxxms


本文总阅读量

1、在查看mysqllog日志的时候不经意间发现一条这个提示:

1
[Note] InnoDB: page_cleaner: 1000ms intended loop took 16111ms. The settings might not be optimal. (flushed=7 and evicted=0, during the time.)

造成该问题的主要原因:

1
2
3
4
5
6
7
page_cleaner_thread:脏页清理线程负责将脏页从内存写到磁盘。

出现该问题的原因:上面提示的信息的含义是,有大量脏页需要刷新,理论上应该在1s内完成,但实际却用了16s的时间将脏页刷新到磁盘,它接受脏页的数量远远大于它每秒能够处理脏页的能力,因此为了避免该问题,可降低每秒循环期间搜索脏页的深度(innodb_lru_scan_depth)。

如果数据库存在很多的buffer pool instance 将会引起更多的刷新工作,因此如果只是增大 buffer pool instances 而没有降低lru_scan_depth,很可能会引起性能瓶颈。

如果只是临时对数据库进行大量导入操作造成的这类问题,可以忽略这个问题不需关注。如果数据库一直存在大量更新操作,快速创建大量的脏页,该问题一直存在需要关注。

下面是官方文档对lru_scan_depth参数的解释,中文为自己对官方文档的理解翻译,错误之处望大家指正。

1
2
3
4
5
A setting smaller than the default is generally suitable for most workloads. A value that is much higher than necessary may impact performance. Only consider increasing the value if you have spare I/O capacity under a typical workload. Conversely, if a write-intensive workload saturates your I/O capacity, decrease the value, especially in the case of a large buffer pool.
When tuning innodb_lru_scan_depth, start with a low value and configure the setting upward with the goal of rarely seeing zero free pages. Also, consider adjusting innodb_lru_scan_depth when changing the number of buffer pool instances, since innodb_lru_scan_depth * innodb_buffer_pool_instances defines the amount of work performed by the page cleaner thread each second.
比默认值小适合于大多数工作负载,如果设置比默认值大可能会影响性能。只有当有额外的磁盘io容量的时候才考虑需不需要增加该值。相反,如果在写密集度负载已经使io容量饱和,需要降低该值,尤其是buffer pool的值设置特别大的时候。

如果lru_scan_depth值特别低,而且存在0空闲页,可以考虑调高该值。如果调整buffer pool instances时,需要考虑是否调整innodb_lru_scan_depth大小,因为innodb_lru_scan_depth * innodb_buffer_pool_instances决定了每秒page cleaner thread处理的工作量。

2、解决方法

1
SET GLOBAL innodb_lru_scan_depth=256;

该参数默认只为1024。
这只是数据库级别调整,出现该问题还需要查看服务器硬件问题,磁盘io是否达到瓶颈扥问题。

目录
  1. 1. 1、在查看mysqllog日志的时候不经意间发现一条这个提示:
  2. 2. 2、解决方法

Proudly powered by Hexo and Theme by Lap
本站访客数人次
© 2020 zeven0707's blog