CPU 100%故障诊断最佳实践:DBA视角的系统层+数据库层排查路径

简介: 数据库小学妹教你快速定位MySQL CPU 100%根因:用top锁定mysqld进程,vmstat/iostat区分us/sy/wa瓶颈,SHOW PROCESSLIST揪出慢SQL与锁竞争,结合慢日志、InnoDB状态及连接风暴分析,精准避坑不重启。

📌今日关键词:CPU 100%、top、vmstat、iostat、SHOW PROCESSLIST、慢查询、InnoDB、锁竞争、连接风暴

大家好,我是数据库小学妹 👋

凌晨收到CPU 100%告警,是不是很慌?

之前有朋友问我:CPU飙满了,怎么判断是不是数据库的锅?

说实话,我第一次遇到完全懵了。只知道重启数据库。后来发现重启不管用,半小时后CPU又飙满了。

今天就聊聊,DBA遇到CPU 100%该怎么排查。

先搞清楚CPU在忙什么

CPU占满不是问题的终点。us、sy、wa才是关键线索。

us(用户态):应用在跑计算。us高,通常是SQL在做大量计算或排序。

sy(内核态):系统在忙。sy高,通常是连接风暴或锁竞争。

wa(IO等待):CPU在等磁盘。wa高,说明磁盘是瓶颈。

load average:top第一行有三个数。一分钟、五分钟、十五分钟的平均负载。负载接近或超过CPU核数,说明压力很大。

这几个指标看完,CPU 100%的原因基本就有方向了。

第一步:top看谁在吃CPU

top -c

看到CPU 100%,先看哪个进程在吃资源。

如果是mysqld,数据库本身有压力。继续往下排查。

如果是别的进程,比如Java应用,CPU高可能跟数据库无关。到这步就可以转给开发了。

关键看两个东西:哪个进程吃CPU,吃了多少。mysqld独占80%以上,基本锁定是数据库问题。

第二步:vmstat看全局趋势

vmstat 1 10

每隔1秒采样10次,观察趋势。

r列(运行队列):大于CPU核数,CPU已经不够用了。

b列(阻塞队列):大于0说明进程在等IO。

swap列的si、so:非0说明内存不够,在换入换出。

cs列(上下文切换):突然飙升,检查连接数和锁。

vmstat讲究看趋势。单次值没意义,连续看几秒才准。

第三步:iostat确认IO瓶颈

iostat -x 1

%util接近100%,磁盘快打满了。

await远大于svctm,IO在排队了。

CPU 100%有时候是假象。wa高说明瓶颈在磁盘,CPU其实在等IO。这时候加CPU没用,得解决磁盘问题。

第四步:SHOW PROCESSLIST查数据库

系统层看完,如果锁定了mysqld,就该深入数据库了。

SHOW FULL PROCESSLIST;

这一步是DBA排查的核心。看三个东西:

连接数:正常几十到几百。突然飙到几千,就是连接风暴。连接风暴会触发大量上下文切换,sy直接飙高。

正在执行的SQL:State列显示Executing的,就是正在跑的SQL。有没有跑了很久的慢SQL?

锁等待:State显示Lock wait的,说明在等锁。大量Lock wait堆积,CPU全花在锁管理上了。

连接风暴是CPU高的常见原因。应用连接池配置不当,或者故障重试机制有问题,瞬间打进来几千个连接。

第五步:慢查询找元凶

-- 看当前执行时间最长的SQL
SELECT * FROM information_schema.processlist 
WHERE command != 'Sleep' 
ORDER BY time DESC LIMIT 10;

或者直接看慢查询日志:

tail -100 /var/log/mysql/slow.log

慢查询是CPU高的最大元凶。常见情况:

全表扫描:没走索引,几百万行全扫一遍。CPU一直在做行比较。

复杂排序:ORDER BY + GROUP BY组合,临时表放不下写磁盘。CPU和IO同时飙高。

子查询嵌套:优化器选错执行计划,嵌套循环跑了上亿次。

看Rows_examined字段。扫描行数远大于返回行数,就是索引没用对。

补充:InnoDB状态看锁竞争

SHOW ENGINE INNODB STATUS\G

重点看TRANSACTIONS部分。

如果有大量lock wait,说明热点行竞争严重。比如电商场景的库存扣减、账户余额变更,大量事务抢同一行。

InnoDB行锁虽然粒度小,但热点行场景下跟表锁没区别。CPU全花在锁管理上了。

再看BUFFER POOL部分。Buffer pool hit rate低于99%,说明内存不够,频繁从磁盘读数据。这也会加重CPU负担。

排查决策树

整个过程用决策树串起来:

用top找到吃CPU的进程。不是mysqld就转开发。

是mysqld就vmstat看sy是否高。sy高查连接数。

sy正常查wa。wa高查iostat看磁盘。

wa正常查us。us高查慢查询。

慢查询正常查SHOW PROCESSLIST。有Lock wait查锁竞争。

避坑清单

  1. 不要上来就重启:重启丢现场,后面找不到根因
  2. 先保存现场:top、vmstat、SHOW PROCESSLIST结果先存下来
  3. us/sy/wa要分清:us高是计算问题,sy高是连接/锁问题,wa高是磁盘问题
  4. 连接数要监控:连接风暴是CPU高的常见元凶
  5. 看Rows_examined:扫描行数远大于返回行数,索引有问题
  6. 热点行要警惕:库存扣减、余额变更是高频锁竞争场景
  7. Buffer pool hit rate要关注:低于99%说明内存不够
  8. 慢查询日志要开:没开慢查询日志,排查就是瞎猜
  9. 不要只看平均值:一条慢SQL就能把CPU打满
  10. 完善监控:出事后第一件事是完善监控,别第二次还是懵的

这些命令看着不多,但排一次完整的故障就全记住了。

下一篇我来讲,凌晨3点从库备份锁表怎么一步步把整个系统拖垮的。真实案例,比工具命令有用多了。

我是数据库小学妹,咱们下篇见 👋

相关文章
|
25天前
|
SQL 人工智能 自然语言处理
Vibe Coding 是什么?当“感觉编程”遇上数据库
Vibe Coding是2026年编程圈最火的概念之一,指开发者通过自然语言描述“感觉”或“意图”,由AI自动生成代码、调试、优化。本文从Vibe Coding的起源讲起,分析它如何改变数据库开发方式:从手写SQL到自然语言查询、从人工调索引到AI推荐、从经验运维到智能诊断。探讨这项趋势对DBA职业的影响,并给出拥抱变化的实用建议。技术会变,但人的判断力、审美和业务理解才是长期竞争力。
|
20天前
|
人工智能 IDE 开发工具
2026深度实测:5款主流AI编程助手功能拆解与推荐
本文实测TRAE、Tabnine、Copilot、Gemini Code Assist与Replit AI五款主流AI编程工具,聚焦中文理解、补全速度、隐私保护与生态适配。TRAE凭多模型支持、Builder智能体及卓越中文能力脱颖而出;Tabnine胜在本地隐私;Copilot生态强但中文弱;Gemini多模态亮眼;Replit适合云端教学。附真实Flask代码案例。(239字)
815 0
|
9天前
|
Prometheus 运维 监控
数据库监控最佳实践:Prometheus+Grafana巡检体系搭建
讲述数据库巡检体系的搭建过程,包括巡检指标设计、Prometheus+Grafana实战、告警阈值设置、故障预测,附避坑清单
|
14天前
|
SQL 关系型数据库 MySQL
MySQL死锁排查最佳实践:锁机制原理与高频死锁模式分析
以线上订单系统锁等待超时为切入,拆解InnoDB锁类型与死锁日志解读方法,总结交叉更新、唯一索引冲突、间隙锁重叠、外键级联锁四种高频死锁模式的排查与避坑经验
|
15天前
|
运维 监控 负载均衡
分布式集群架构选型:数据库场景下的分库分表与多副本方案
拆解分布式、集群、分布式集群三个概念的区别与联系,结合数据库场景讲清楚分片策略、一致性、负载均衡、故障转移等关键技术点,附架构对比表和避坑清单。
|
16天前
|
SQL 算法 关系型数据库
数据库大表ALTER最佳实践:pt-osc、gh-ost原理与生产调优
数据库小学妹分享大表ALTER避坑指南:详解Instant DDL(8.0+毫秒加字段)、pt-osc(触发器同步)与gh-ost(binlog解析)三大方案,剖析MDL锁、COPY/INPLACE算法及磁盘空间陷阱,助你安全完成在线DDL变更。(239字)
|
20天前
|
存储 人工智能 多模数据库
大模型时代数据库角色转型实战:从RAG检索增强到AI Agent数据底座的架构思考
本文探讨大模型时代数据库角色的深刻转变:从数据存储转向AI底座。详解RAG如何依赖向量数据库实现知识增强,Agent如何依托数据库实现记忆持久化与上下文管理,以及多模数据库如何支撑AI Agent的工具调用与执行。DBA需扩展向量检索、多模存储等新能力,而非被替代。(239字)
|
21天前
|
SQL 运维 自然语言处理
国产向量数据库有哪些?两大技术流派深度对比与选型指南
向量数据库是2026年数据库领域增长最快的细分赛道之一。本文从RAG应用和企业知识库的实际需求出发,系统梳理国产向量数据库的两大技术流派——独立向量数据库与融合型向量数据库,深入对比两者的架构差异、适用边界和选型逻辑。
|
21天前
|
运维 监控 Java
MySQL从库备份引发CPU 100%:级联故障排查与修复最佳实践
本文以凌晨CPU 100%故障为切入点,真实复盘一次由从库物理备份触发`FLUSH TABLES WITH READ LOCK`锁表引发的级联故障:查询阻塞→连接池耗尽→Full GC风暴→服务雪崩。详解根因、排查路径(jstat/GC分析→锁诊断→线程追踪)及改进方案(XtraBackup热备、超时降级、分层告警等),强调备份策略必须评估业务影响。(239字)
|
23天前
|
SQL 监控 关系型数据库
MySQL复制模式选型最佳实践:异步、半同步、GTID与组复制的深度对比
MySQL主从复制有异步、半同步、GTID、组复制(MGR)四大模式:异步性能最优但有丢数风险;半同步兼顾安全与性能,推荐多数业务;GTID简化故障切换;MGR提供强一致,适用于金融核心。binlog与读写分离是其基石。(239字)