news 2026/7/10 7:43:28

CPU使用率监控:揪出消耗源的“三层雷达”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CPU使用率监控:揪出消耗源的“三层雷达”

操作系统层:进程与线程级快照
全局视图:top -c(或htop),关注 %Cpu(s) 整体使用率、mysqld 进程的 %CPU 及 load average。
进程精准跟踪:pidstat -p <mysqld_pid> 1,按秒刷新进程的CPU占用、上下文切换等。
线程级解剖:top -H -p <mysqld_pid>,找出MySQL内部哪个线程在大量消耗CPU。结合 performance_schema.threads 表,通过 THREAD_OS_ID 反查该线程是用户连接还是后台线程。
函数级热点(优化利器):perf top -p <mysqld_pid>,实时显示进程内部函数调用开销。当CPU飙升却无慢查询时,可快速发现是ut_delay(锁自旋)、buf_page_io_complete(IO完成处理)或LRU相关函数在消耗CPU。
2. MySQL全局状态:宏观计数器
借助 SHOW GLOBAL STATUS 提取反映CPU压力的核心指标:

– 每秒查询量(大体反映CPU活跃度)
SHOW GLOBAL STATUS LIKE ‘Questions’;
SHOW GLOBAL STATUS LIKE ‘Uptime’;
– 计算 Questions / Uptime 得到每秒平均查询数

– 当前活跃线程数(是否是连接风暴)
SHOW GLOBAL STATUS LIKE ‘Threads_running’;

– InnoDB行操作量(内部CPU开销)
SHOW GLOBAL STATUS LIKE ‘Innodb_rows_read’;
SHOW GLOBAL STATUS LIKE ‘Innodb_rows_updated’;
将这些指标用Prometheus等时序库收集,可绘制QPS、Threads_running趋势图,CPU飙升通常伴随着它们的突增。

  1. Performance Schema:线程级别的CPU消费
    MySQL 8.0的performance_schema已能直接记录线程的CPU时间(需开启相关instrument):

– 查看当前执行的SQL及其累计CPU时间(需要在setup_consumers中启用events_statements_current等)
SELECT
t.THREAD_ID,
t.PROCESSLIST_ID,
t.PROCESSLIST_USER,
t.PROCESSLIST_INFO,
st.SUM_TIMER_WAIT / 1000000000000 AS cpu_seconds
FROM performance_schema.events_statements_current st
JOIN performance_schema.threads t ON st.THREAD_ID = t.THREAD_ID
WHERE t.TYPE = ‘FOREGROUND’
ORDER BY cpu_seconds DESC;
更常用的监控视图sys.statement_analysis和sys.user_summary均基于这些数据,展示按总耗时排序的SQL,直接指向CPU消耗大户。

实战建议:将Threads_running阈值告警设为CPU核数的2倍,配合perf top或sys.statement_analysis,可在5分钟内定位绝大多数CPU问题。

二、内存使用率监控:认清“分配”与“实际占用”
MySQL的内存结构复杂,分为全局共享内存(如innodb_buffer_pool)和会话私有内存(如排序缓冲、连接缓冲)。监控时必须区分操作系统看到的物理内存占用(RSS)与MySQL内部已分配但未使用的内存,避免OOM风险。

  1. 操作系统层:看“实际消耗”
    基础命令:ps aux | grep mysqld 查看 RSS(常驻内存集),free -h 看系统整体内存。
    更精准:smem -t -p mysqld 可分析PSS(比例分摊共享内存),避免共享库重复计算。
    内存压力:cat /proc/meminfo 关注 MemAvailable,配合 dmesg | grep -i oom 监控OOM Killer活动。
  2. MySQL内存组成的理论计算
    运维中常通过以下公式估算MySQL最大可能内存使用量:

总内存 ≈ innodb_buffer_pool_size
+ key_buffer_size
+ query_cache_size (8.0已移除)
+ max_connections × (sort_buffer_size + read_buffer_size + join_buffer_size + binlog_cache_size + thread_stack + 临时表开销)
+ 其他(performance_schema, AHI等)
查询配置:

SELECT
@@innodb_buffer_pool_size/1024/1024 AS buffer_pool_MB,
@@key_buffer_size/1024/1024 AS key_buffer_MB,
@@max_connections,
@@sort_buffer_size/1024 AS sort_buffer_KB,
@@read_buffer_size/1024 AS read_buffer_KB,
@@join_buffer_size/1024 AS join_buffer_KB,
@@thread_stack/1024 AS thread_stack_KB;
关键点:会话级缓冲虽按需分配,但若max_connections过大,峰值内存可能远超物理内存。此为常见的配置陷阱。

  1. Performance Schema 内存监控(8.0重磅功能)
    MySQL 8.0内置了详细的内存使用统计,通过memory_summary系列表可查看各类内存分配的明细:

– 按内存事件类型查看总计分配与释放
SELECT
EVENT_NAME,
CURRENT_NUMBER_OF_BYTES_USED / 1024 / 1024 AS currently_used_MB,
HIGH_NUMBER_OF_BYTES_USED / 1024 / 1024 AS high_used_MB
FROM performance_schema.memory_summary_global_by_event_name
WHERE CURRENT_NUMBER_OF_BYTES_USED > 0
ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
LIMIT 10;
常见内存大户:memory/innodb/buf_buf_pool(缓冲池)、memory/sql/TABLE(表缓存)、memory/innodb/mem0mem(InnoDB内部堆),以及临时表内存。

此外,sys.memory_global_total 和 sys.memory_by_user_by_current_bytes 视图提供了更直观的汇总。

  1. InnoDB缓冲池内存使用细节
    缓冲池是内存的头号消费者,需监控其内部利用率和命中率:

– 缓冲池大小与使用量
SHOW STATUS LIKE ‘Innodb_buffer_pool_pages_total’;
SHOW STATUS LIKE ‘Innodb_buffer_pool_pages_free’;
– 命中率(如前文公式)
结合 innodb_buffer_pool_size 设置,可评估是否存在浪费或不足。

三、构建一体化监控体系(Prometheus + Grafana)
手动采集零散指标难以形成趋势,生产环境强烈建议搭建时序监控。经典组合:

mysqld_exporter:Prometheus官方出口,暴露数百个MySQL指标,包括上面提到的mysql_global_status_threads_running、mysql_global_variables_innodb_buffer_pool_size、mysql_global_status_innodb_buffer_pool_read_requests等。CPU相关指标可利用mysql_global_status_questions推算QPS。
node_exporter:采集操作系统CPU、内存、磁盘等指标,如node_cpu_seconds_total、node_memory_MemAvailable_bytes。
Grafana仪表板:使用社区模板(如Percona的MySQL Overview),聚合展示。
核心告警规则:
CPU使用率:node_cpu_utilisation > 80% 持续5分钟。
内存可用:node_memory_MemAvailable_bytes < 物理内存的10%。
MySQL缓冲池命中率:(1 - (rate(mysql_global_status_innodb_buffer_pool_reads[5m]) / rate(mysql_global_status_innodb_buffer_pool_read_requests[5m]))) * 100 < 99%。
运行线程数:mysql_global_status_threads_running > 核数×2。
四、监控实践要诀:从“看得见”到“看得懂”
CPU监控:优先关注 Threads_running 和活跃SQL的CPU累计消耗,再结合操作系统线程分析,区分“计算密集”和“锁/IO等待导致的内核态开销”。
内存监控:避免只看RSS,需结合Performance Schema的内存总量统计,并定期扫描 memory_summary_global_by_event_name 中的 HIGH_NUMBER_OF_BYTES_USED,防止内存泄漏。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 7:42:52

2026最新源支付ypay源码系统9.1.1可运营版本

亲测实测完美运行&#xff0c;ypay源支付9.1.1独家最新优化版 无论你是新手小白还是老站长都能轻松上手搭建个属于自己的码支付系统。下载源码&#xff0c;开箱即用&#xff01;&#xff01;&#xff01; ⚠️注意&#xff1a; 市面上的1.89、1.98通用版本已彻底报废、全部有bu…

作者头像 李华
网站建设 2026/7/10 7:42:44

Lightweight Charts 4.0 与 KLineChart 10.0 对比:Vue 3 集成 5 步实战与性能实测

Lightweight Charts 4.0 与 KLineChart 10.0 深度对比&#xff1a;Vue 3 集成实战与性能优化指南金融数据可视化是现代前端开发中不可或缺的一环。在众多图表库中&#xff0c;Lightweight Charts 和 KLineChart 凭借其轻量级和专业性脱颖而出。本文将深入对比这两个库在 Vue 3 …

作者头像 李华
网站建设 2026/7/10 7:42:37

TB6593FNG与PIC18F65K40直流电机控制方案详解

1. 项目概述&#xff1a;TB6593FNG与PIC18F65K40的直流电机控制方案在工业自动化和嵌入式控制领域&#xff0c;直流电机的高性能驱动一直是工程师面临的经典挑战。TB6593FNG作为东芝半导体推出的H桥驱动芯片&#xff0c;与Microchip的PIC18F65K40微控制器组合&#xff0c;形成了…

作者头像 李华
网站建设 2026/7/10 7:41:39

eMule 2026实战配置指南:ED2K协议在Win10/Win11下的稳定下载方案

1. 这不是“过时软件”的怀旧指南&#xff0c;而是ED2K网络里依然在呼吸的实用工具eMule这个名字&#xff0c;对很多刚接触P2P下载的新手来说&#xff0c;像一本蒙着灰的旧书——它没有迅雷的广告弹窗&#xff0c;不靠会员加速&#xff0c;也不绑定手机验证。但如果你真去翻一翻…

作者头像 李华
网站建设 2026/7/10 7:41:04

STM32串行通信DMA的使用

STM32串行通信DMA的使用1. 配置2. 代码1. 配置 简单说 发送端Memory地址自增打开&#xff1b;发送模式Normal&#xff1b;接收端地址自增关闭&#xff0c;这里每次接收并处理1字节&#xff1b;接收模式Normal&#xff1b; 2. 代码 如果使用 printf 函数&#xff0c;需要更改…

作者头像 李华