Mysql innodb是如何刷新脏页的,innodb的策略是尽量使用内存,假设我们给的innodb 内存是1g,当一个请求到达mysql 时,这时候innodb 就会把最久不使用的数据页释放掉,供给新的请求使用,如果这个被释放的页原本就是干净的,直接使用。如果这是一个脏页,就必须把脏页刷新到磁盘,然后才能使用。
相关参数:
Innodb_io_capacity 磁盘的io能力, 可以通过fio测试磁盘的iops,这个值就是磁盘的io能力,建议innodb_io_capacity 参数=iops
但是mysql并不是全力按照上面的参数进行刷新脏页,刷新速度受到两个因素影响,一个是脏页比例,一个是redo log 写盘速度。
参数innodb_max_dirty_pages_pct 脏页比例上线 默认75% 我认为一般不用改。
下面语句可以得到当前的脏页的比例。
select VARIABLE_VALUE into @a fromglobal_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
select VARIABLE_VALUE into @b fromglobal_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
select @a/@b;
在刷新脏页过程中,如果磁盘脏页邻近也是脏页,会把这个邻居也flush掉,这个行为由innodb_flush_neighbors 来控制,这个参数对机性硬盘来说很有效,可以减少随机io,增加性能。如果是ssd类磁盘,建议设置为0,可以更快的刷新脏页。Mysql8.0中,这个参数已经默认为0了。
如何看到到底由多少脏页没有刷新呢。
Show engine innodb status\G
找到log 部分
Checkpoint lsn 就是 和lsn 之间的差就是脏页,只有之间相差不是太大,认为就是没有问题,如果很大的话,说明很多脏页没有刷新到磁盘,此时肯定会影响mysql性能,需要注意。