一、引言:CPU飙升的危害与排查意义
MySQL作为业务系统的核心数据存储组件,其性能直接决定了应用的响应速度与稳定性。当MySQL服务器CPU占用率飙升至100%时,最直观的影响是查询响应时间急剧增加,用户操作出现卡顿甚至超时;严重时会导致新连接无法建立,已有事务阻塞,最终引发业务中断。更隐蔽的危害在于,长期高CPU负载会加速硬件老化,增加数据库崩溃的风险。
及时排查并解决MySQL CPU 100%的问题,不仅能恢复系统正常运行,更能避免因数据服务中断造成的业务损失。排查过程需遵循"从现象到本质、分层定位、逐步缩小范围"的原则,避免盲目操作导致问题扩大。
二、第一步:确认CPU高占用的真实性与范围
1. 验证CPU负载情况
首先需通过系统工具确认CPU高占用是否真实存在,以及是否由MySQL进程导致。
- 使用
top
命令查看系统整体负载:在终端输入top
后,观察第一行的%Cpu(s)
指标,其中us
(用户态CPU占比)若持续高于80%,可能是MySQL计算密集型操作导致;sy
(系统态CPU占比)过高则可能与磁盘IO、锁竞争相关。 - 定位MySQL进程:在
top
界面按P
按CPU占用排序,找到名为mysqld
的进程,记录其PID和CPU占比。若该进程CPU占比超过90%,可初步判定问题源于MySQL。 - 补充验证:执行
ps -aux | grep mysql
,输出结果中%CPU
列即为MySQL进程的CPU占用率,与top
结果交叉验证。
2. 确定影响范围
明确问题的边界是高效排查的关键:
- 业务影响范围:检查是所有功能模块受影响,还是特定接口(如订单查询、数据统计)异常,这有助于关联对应的数据库操作。
- 时间特征:记录CPU飙升的开始时间,判断是持续性(如代码发布后一直高负载)还是间歇性(如定时任务执行时触发)。
- 关联事件:排查同期是否有业务变更(如大促活动)、数据导入、索引重建等操作,这些都可能引发CPU突增。
三、第二步:抓取MySQL运行状态数据
1. 利用MySQL内置工具收集信息
MySQL提供了多个工具和视图,可实时查看内部运行状态:
- 查看活跃连接:执行
show processlist;
,输出结果包含当前所有连接的ID、用户、执行状态、耗时等信息。重点关注State
列显示为"Running"且Time
(耗时)超过10秒的线程,这些极可能是CPU消耗的源头。 - 获取完整SQL:
show processlist;
仅显示SQL前100个字符,如需完整语句,可执行show full processlist;
,或查询information_schema.processlist
表:select id, user, host, db, command, time, state, info from information_schema.processlist where time > 10 and state != 'Sleep';