办公地址

甘肃兰州市城关区焦家湾路260号天运小区A栋1002室

服务城市
中国
时间
周一 - 周五 9:00am-17:30pm
lzwd@gsidc.net.cn
24 X 7 在线服务

常见问题

MySQL InnoDB 的严重性能警告日志

  • 发布时间:2026-05-07 09:43:29
  • 发布者:lzwd
  • 浏览:0


🔴 问题核心解读

日志中的关键信息是:

plaintext

InnoDB: page_cleaner: 1000ms intended loop took XXXXXms. The settings might not be optimal.

page_cleaner 是 InnoDB 的核心后台线程,负责定期把内存中脏页刷写到磁盘,来释放内存空间。

它本应 每 1000ms(1 秒)执行一次循环,但现在却花了 几秒甚至几十秒 才完成一次。

这说明 磁盘写入速度远跟不上 MySQL 的刷盘请求,导致线程严重超时,系统无法及时释放内存,性能会急剧下降,甚至引发锁等待超时、服务崩溃。


📌 关键指标分析

表格

日志字段 含义 风险解读

took 44030ms 单次刷盘循环耗时 正常应 < 1000ms,现在耗时 44 秒,说明磁盘 I/O 已经被完全堵死

flushed=117 本次循环刷写的脏页数量 数量不多,但耗时极长,说明磁盘写入速度极低

evicted=0 本次循环淘汰的页数量 0 表示刷盘不及时,内存压力无法缓解,后续会越来越严重

✅ 紧急解决步骤(按优先级)

1. 立刻排查磁盘性能(最高优先级)

这是问题的根源,优先解决。

检查磁盘类型:如果是机械硬盘(HDD),建议立刻更换为 SSD。

查看磁盘使用率:在服务器执行 df -h,确保磁盘使用率未超过 80%。

查看磁盘 I/O 负载:执行 iostat -x 1,重点看 %util 列。如果 %util 长期接近 100%,说明磁盘已经是性能瓶颈。

2. 优化 MySQL InnoDB 刷盘配置

在 my.cnf 或 my.ini 中修改以下参数,缓解刷盘压力:

ini

# 调整刷盘线程数,默认通常为4,可根据CPU核心数适当增加

innodb_page_cleaners = 8

# 降低刷盘频率,平衡性能与数据安全(注意:掉电可能丢失少量数据)

innodb_flush_log_at_trx_commit = 2

innodb_flush_method = O_DIRECT

# 调整脏页比例,减少单次刷盘量

innodb_max_dirty_pages_pct = 75

innodb_max_dirty_pages_pct_lwm = 10

修改后重启 MySQL 服务生效。

3. 排查业务层面的高写入操作

慢查询日志:检查是否有大量批量写入、更新或删除操作。

事务优化:是否存在长时间未提交的大事务,导致大量脏页堆积。

索引优化:确认写入操作涉及的表索引是否过多,索引过多会显著增加刷盘开销。

⚠️ 风险提示

这个问题如果不处理,会导致:

数据库性能持续恶化,出现大量锁等待超时

内存无法释放,导致 MySQL 进程占用内存过高

极端情况下,会导致 MySQL 服务宕机或崩溃

把此文扫码分享到手机: