Mysql脏页、刷脏

发布于 2023-05-05  145 次阅读


目标:什么是脏页,怎么刷脏。

什么是脏页

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个不一致的内存页为“脏页”。


刷脏配置

临时设置方式


SET [SESSION | GLOBAL] innodb_io_capacity = value;

脏页IO配置

查看返回结果的read和write下面的iops avg=xxx

根据avg来决定innodb_io_capacity参数的大小


# 简单的查看磁盘IO语句
fio -filename=io_test -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16K  -size=500M -numjobs=10  -runtime=10 -group_reporting -name=mytest

通过innodb_io_capacity设置,修改刷脏的速度


[mysqld]
innodb_io_capacity = 2000

配置合理的脏页比例上限

通过innodb_max_dirty_pages_pct设置脏页比例上限

当脏页比例接近此值,会加速刷脏页

建议保持默认值75%


[mysqld]
innodb_max_dirty_pages_pct = 75

邻近刷脏配置

innodb_flush_negihbors是一个MySQL数据库的InnoDB存储引擎的配置参数,用于设置在刷新脏页时是否同时刷新相邻的脏页。这个参数对于减少磁盘随机写操作,提高磁盘利用率,特别是在机械硬盘(HDD)上效果明显。

SSD建议设置为0,Mysql8.0已经默认为0

  • 0:禁用邻居刷新。InnoDB仅刷新请求的脏页,而不刷新相邻的脏页。
  • 1:启用邻居刷新。在刷新脏页时,InnoDB会同时刷新相邻的脏页,以减少随机写操作。这在使用机械硬盘(HDD)时效果较好。
  • 2:始终刷新邻居。不仅在刷新脏页时刷新相邻的脏页,还会在任何时候都尝试刷新邻居。这种设置可能会导致更多的写操作,但在某些情况下可能会提高性能。

[mysqld]
innodb_flush_neighbors = 0

总结

  • 刷脏可能会导致Mysql卡住,造成性能的问题。
  • 通过告知Mysql服务器IO的性能,可以控制合理的刷脏IO
  • 合理的脏页比例上限,建议保持默认值
  • “邻近刷脏页”功能在SSD硬盘下需要禁用

间歇性凌云壮志,持续性混吃等死