MySQL InnoDB page_cleaner设置可能不是最佳的


17

在mysqld.log中看到此注释:

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

似乎在这里提到了这样的事情: MySQL实例停滞“正在执行SYNC索引”

我的问题是:如果在日志中看到此注释,应该采取什么措施(如果有)?

MySQL和OS版本:
mysql-community-server- 5.7.9 -1.el7.x86_64
centos-release-7-1.1503.el7.centos.2.8.x86_64

运行显示变量,例如“ innodb%”;如建议显示:

innodb_page_cleaners | 1

Answers:


11

在MySQL 5.7.8中,将innodb_page_cleaners的默认值从1更改为4。如果页面清理程序线程的数量超过缓冲池实例的数量,则innodb_page_cleaners会自动设置为与innodb_buffer_pool_instances相同的值。

使用以下命令检查innodb_buffer_pool_instances:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_instances'

innodb_page_cleaners最高只能设置为innodb_buffer_pool_instances。如果需要,innodb_page_cleaners=4那么还需要innodb_buffer_pool_instances=4


2
好吧,我将innodb_buffer_pool_instances和innodb_page_cleaners都设置为8,我偶尔会看到警告。在繁重的I / O操作(例如优化表等)期间,它只是一堆条带化的台式机类旋转磁盘,我想这只是mysql告诉您磁盘太慢的微妙方式;)
Aleksandar Ivanisevic

5

我们在各个客户端上都遇到了相同的问题,发现问题是由于将innodb_lru_scan_depth的值从默认值1024设置为低至128。尽管降低该值会减少处理事务所需的时间,尤其是在写绑定工作负载中我认为将该值设置得太低会使缓冲池无法跟上清除其某些缓冲区和缓冲池脏页的速度。

在我们的案例中,我们看到了将值从128增加到256的巨大改进,但是通常正确的值取决于硬件和负载类型。诀窍是要在提高OLTP性能和让MySQL保持缓冲池干净之间找到正确的值,以免page_cleaner需要做大量工作,如上述消息所述(“ InnoDB:page_cleaner:1000ms预期循环花了15888毫秒”)。

该值可以动态更改,而无需重新启动MySQL,例如

SET GLOBAL innodb_lru_scan_depth=256;

1
如果我重新启动MySQL,那么innodb_lru_scan_depth会返回到1024,那么如何永久更改它呢?
卡里姆·萨米尔

@KarimSamir innodb_lru_scan_depth = 256my.cnf加载路径中添加一个位置。
Quentin Skousen

0

这个StackOverflow线程可能很有用...

/programming/41134785/how-to-solve-mysql-warning-innodb-page-cleaner-1000ms-intended-loop-took-xxx

基本上,这意味着您的数据库写入过多,导致BufferPool充满脏值。这将触发PageCleaner进行操作并清除脏页面。由于脏页比平时过多,因此PageCleaner清除缓冲区需要花费更多时间。

innodb_lru_scan_depth特定变量控制应进行多少缓冲池扫描以进行清除。这可能是一个很大的值,或者系统的写入吞吐量确实很高,从而导致大量脏页。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.