
今日关键词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高通常是连接风暴或锁竞争。waIO等待CPU在等磁盘。wa高说明磁盘是瓶颈。load averagetop第一行有三个数。一分钟、五分钟、十五分钟的平均负载。负载接近或超过CPU核数说明压力很大。这几个指标看完CPU 100%的原因基本就有方向了。第一步top看谁在吃CPUtop-c看到CPU 100%先看哪个进程在吃资源。如果是mysqld数据库本身有压力。继续往下排查。如果是别的进程比如Java应用CPU高可能跟数据库无关。到这步就可以转给开发了。关键看两个东西哪个进程吃CPU吃了多少。mysqld独占80%以上基本锁定是数据库问题。第二步vmstat看全局趋势vmstat110每隔1秒采样10次观察趋势。r列运行队列大于CPU核数CPU已经不够用了。b列阻塞队列大于0说明进程在等IO。swap列的si、so非0说明内存不够在换入换出。cs列上下文切换突然飙升检查连接数和锁。vmstat讲究看趋势。单次值没意义连续看几秒才准。第三步iostat确认IO瓶颈iostat-x1%util接近100%磁盘快打满了。await远大于svctmIO在排队了。CPU 100%有时候是假象。wa高说明瓶颈在磁盘CPU其实在等IO。这时候加CPU没用得解决磁盘问题。第四步SHOW PROCESSLIST查数据库系统层看完如果锁定了mysqld就该深入数据库了。SHOWFULLPROCESSLIST;这一步是DBA排查的核心。看三个东西连接数正常几十到几百。突然飙到几千就是连接风暴。连接风暴会触发大量上下文切换sy直接飙高。正在执行的SQLState列显示Executing的就是正在跑的SQL。有没有跑了很久的慢SQL锁等待State显示Lock wait的说明在等锁。大量Lock wait堆积CPU全花在锁管理上了。连接风暴是CPU高的常见原因。应用连接池配置不当或者故障重试机制有问题瞬间打进来几千个连接。第五步慢查询找元凶-- 看当前执行时间最长的SQLSELECT*FROMinformation_schema.processlistWHEREcommand!SleepORDERBYtimeDESCLIMIT10;或者直接看慢查询日志tail-100/var/log/mysql/slow.log慢查询是CPU高的最大元凶。常见情况全表扫描没走索引几百万行全扫一遍。CPU一直在做行比较。复杂排序ORDER BY GROUP BY组合临时表放不下写磁盘。CPU和IO同时飙高。子查询嵌套优化器选错执行计划嵌套循环跑了上亿次。看Rows_examined字段。扫描行数远大于返回行数就是索引没用对。补充InnoDB状态看锁竞争SHOWENGINEINNODBSTATUS\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查锁竞争。避坑清单不要上来就重启重启丢现场后面找不到根因先保存现场top、vmstat、SHOW PROCESSLIST结果先存下来us/sy/wa要分清us高是计算问题sy高是连接/锁问题wa高是磁盘问题连接数要监控连接风暴是CPU高的常见元凶看Rows_examined扫描行数远大于返回行数索引有问题热点行要警惕库存扣减、余额变更是高频锁竞争场景Buffer pool hit rate要关注低于99%说明内存不够慢查询日志要开没开慢查询日志排查就是瞎猜不要只看平均值一条慢SQL就能把CPU打满完善监控出事后第一件事是完善监控别第二次还是懵的这些命令看着不多但排一次完整的故障就全记住了。下一篇我来讲凌晨3点从库备份锁表怎么一步步把整个系统拖垮的。真实案例比工具命令有用多了。我是数据库小学妹咱们下篇见