一边跑全表更新一边高频轮询脏页数量,再把io_capacity调低模拟慢磁盘,诚实记录这次没能复现出'脏页堆积'的真实原因。
代码-- 后台:全表更新 UPDATE orders SET amount=amount+0.0001; -- 前台:每0.3秒轮询一次 SHOW STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
本以为全表更新5万行会让脏页数量真实明显堆起来,结果只在中间捕捉到两次"1",其余全是0。innodb_io_capacity(本机默认10000)告诉后台的page cleaner线程"这块磁盘每秒能处理多少次I/O操作",本机跑在本地NVMe上,Homebrew安装时真实按高性能存储配置了这个值,page cleaner几乎能跟上脏页产生的速度,导致脏页数量长期贴着0,很难被真实观测到明显堆积。
0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
每一步都是本文上面用高频轮询跑出来的原始结果。
Innodb_buffer_pool_pages_dirty + SET GLOBAL innodb_io_capacity