mysql 8.0 performance_schema 默认全开但多数生产环境只需保留关键消费者,应禁用 events_stages、history 类、table_io/lock_waits 和 memory_summary* 等高开销低价值项,通过 update setup_consumers 动态关闭,可降低内存占用 50mb+ 且不影响 sys schema 和慢日志功能。

MySQL 8.0 的 performance_schema 默认全开,但多数生产环境根本用不到其中 70% 以上的消费者(consumers)和仪器(instruments),不仅吃内存(常驻占用 100–300MB),还会轻微拖慢高并发短事务场景。关闭无用部分比“全关”更合理,也更安全。
哪些 performance_schema 消费者真没必要开
不是所有 consumers 都值得保留。以下几类在常规 OLTP 场景中基本无用,且开销显著:
-
events_stages*:记录语句执行阶段(如 sorting、sending data),对慢查询定位帮助极小,开销却高 -
events_statements_history*和events_transactions_history*:每个线程缓存最近 10 条语句/事务,默认共占数 MB 内存,线上几乎没人查 -
table_io_waits*和table_lock_waits*:表级等待统计,data_locks和data_lock_waits已足够覆盖行锁问题 -
memory_summary*:内存分配汇总,除非你在做深度内存泄漏分析,否则纯属冗余
确认当前启用状态:SELECT NAME, ENABLED FROM performance_schema.setup_consumers WHERE ENABLED = 'YES';
用 UPDATE 直接禁用 consumers(不重启)
修改 setup_consumers 表是运行时生效的,无需重启 MySQL,也比改配置文件更灵活:
- 禁用历史类消费者(最推荐先动这里):
UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME LIKE 'events_%_history%'; - 禁用 stages 和 memory summary:
UPDATE performance_schema.setup_consumers SET ENABLED = 'NO' WHERE NAME IN ('events_stages_current', 'events_stages_history', 'events_stages_history_long', 'memory_summary_global_by_event_name'); - 保留关键消费者(别动):
global_instrumentation、thread_instrumentation、statements_digest—— 它们支撑sysschema 和慢日志聚合
注意:setup_consumers 修改只影响新创建的线程,已存在的连接仍按旧设置采集;但通常几分钟后效果就明显了。
如何验证关闭是否生效 + 内存是否真降了
别只信 SELECT 结果,要观察真实内存变化:
- 查 consumers 状态是否同步:
SELECT NAME, ENABLED FROM performance_schema.setup_consumers WHERE NAME LIKE 'events_%_history%';—— 应全为'NO' - 看内存占用下降:
SELECT EVENT_NAME, CURRENT_NUMBER_OF_BYTES_USED FROM performance_schema.memory_summary_global_by_event_name WHERE CURRENT_NUMBER_OF_BYTES_USED > 1024*1024 ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC LIMIT 5;
重点关注memory/performance_schema/*下的项,关闭后应减少 50MB+(视并发而定) - 检查是否误关关键项:
运行SELECT * FROM sys.statement_analysis LIMIT 1;,若报错或空结果,说明statements_digest或events_statements_summary_by_digest被误关
真正容易被忽略的是:某些监控工具(如 Prometheus mysqld_exporter)依赖特定 consumers,关掉后对应指标会断——得同步检查你的监控大盘有没有丢图。











