性能瓶颈的“诊断优先级”:CPU、IO、内存、网络,先查哪个?

简介: 系统慢了,CPU飙了,磁盘I/O满了——面对一堆异常指标,先查哪个?很多DBA的直觉是“CPU最高就先看CPU”,但CPU高往往是表象,真正的根因可能在磁盘、在网络、在内存。本文从系统层诊断的“先系统后数据库”原则出发,给出CPU、IO、内存、网络四大资源的诊断优先级和排查方法,帮助读者在面对性能问题时不再“眉毛胡子一把抓”。

大家好,我是小耶,写功课只是为了我踩过的坑,你们别再踩了!

上周讲了参数调优——哪些参数值得调、怎么调。但有一个前置问题没解决:你怎么知道该调哪个参数?

系统慢了,CPU飙了,磁盘I/O满了,内存快爆了——面对一堆异常指标,先查哪个?

很多DBA的直觉是“CPU最高就先看CPU”。但CPU高往往是表象,真正的根因可能在磁盘、在网络、在内存。

今天不讲具体参数,先讲一套诊断优先级——遇到性能问题,按什么顺序排查,才不会走弯路。

一、先系统后数据库:不要一上来就查SQL

接到“系统慢了”的反馈,很多DBA的第一反应是翻慢查询日志。这个直觉可以理解,但往往是低效的。

正确的排查顺序是:先看系统层,再看数据库层。

系统层是“体检”——CPU、内存、IO、网络四大资源,哪个亮了红灯?数据库层是“问诊”——系统层没有瓶颈时,才深入数据库内部排查;系统层已亮红灯时,优先解决资源问题。

慢查询日志只记录了“已经慢了的SQL”,不记录“为什么慢”。如果系统层资源已经打满了,翻慢查询日志是浪费时间——先把资源问题解决了,慢查询自然就少了。

二、四大资源的诊断优先级

遇到性能问题,建议按以下顺序排查:

第一步:查磁盘I/O(优先级最高)

为什么I/O排第一?因为I/O问题是数据库性能问题最常见的根源。而且I/O问题的特征很明确,容易被误判为CPU问题。

怎么看?

# 实时查看磁盘I/O

iostat -x 1

关键指标:

指标 含义 危险信号
%util 磁盘繁忙程度 >80% 说明磁盘快打满了
await I/O请求平均等待时间 远超svctm说明在排队
r/s / w/s 每秒读写次数 接近磁盘IOPS上限
wa(top中) CPU等待I/O的时间 >10%说明I/O是瓶颈,CPU在空等磁盘

常见场景:top里看到CPU使用率很高,但wa(iowait)也很高——CPU其实在等磁盘,不是在算数据。这时候加CPU没用,得解决磁盘问题。

怎么解决?

  • 检查是否有全表扫描(会在第三步确认)
  • 检查是否有大量排序操作或临时表写磁盘
  • 调整innodb_io_capacity等I/O相关参数
  • 考虑升级磁盘(HDD→SSD→NVMe)

第二步:查内存(优先级第二)

内存不足会导致频繁的磁盘交换(Swap),而Swap一发生,性能会直接崩盘。内存问题往往表现为“磁盘I/O高”或“CPU高”——因为内存不够,系统在频繁换页,CPU忙着处理换页中断。

怎么看?

# 查看内存使用

free -h

# 查看是否有Swap活动

vmstat 1

关键指标:

指标 含义 危险信号
available / free 可用内存 接近0说明内存不足
si / so(vmstat) Swap换入/换出 非0说明内存在换页
InnoDB缓冲池命中率 数据页在内存中的命中比例 <95%说明缓冲池不够大

常见场景:free -h显示内存快用完了,vmstat的si和so列出现非0值。这时候查SQL没用——加内存才是正解。

怎么解决?

  • 调整innodb_buffer_pool_size(通常设为物理内存的50%-70%)
  • 检查是否有内存泄露(连接未释放、大查询占用大量临时内存)
  • 考虑增加物理内存

第三步:查CPU(优先级第三)

CPU高是数据库性能问题最常见的“报警信号”,但它往往是结果,不是原因。所以CPU排在第三位——先排除了I/O和内存的问题,再看CPU。

怎么看?

# 查看CPU使用情况

top

关键指标:

指标 含义 危险信号
us(用户态) 应用在跑计算 高说明SQL在做大量计算或排序
sy(内核态) 系统在忙 高说明连接风暴或锁竞争
wa(I/O等待) CPU在等磁盘 高说明磁盘是瓶颈
load average 系统平均负载 持续高于CPU核数说明过载

us高的场景:us(用户态CPU)高,说明SQL在做大量计算或排序。这时候才轮到查慢查询日志、看执行计划、优化SQL。

sy高的场景:sy(内核态CPU)高,说明系统在频繁切换上下文。通常是连接风暴或大量锁竞争导致的。

怎么解决?

  • us高 → 优化SQL、加索引、减少排序
  • sy高 → 检查连接数是否突增、检查锁等待
  • 负载高 → 考虑升级CPU或增加节点

第四步:查网络(优先级第四)

网络问题在集中式数据库中相对少见,但在分布式架构中非常关键。网络瓶颈表现为高延迟和数据包丢失。

怎么看?

# 查看网络流量

sar -n DEV 1

关键指标:

指标 含义 危险信号
网络吞吐量 发送/接收速率 接近带宽上限
重传率 数据包重传比例 过高说明网络不稳定

常见场景:应用和数据库在不同机房,跨区域调用延迟高;或者云环境网络带宽被打满。

怎么解决?

  • 将应用和数据库部署在同一可用区
  • 升级网络带宽
  • 优化跨节点查询,减少数据传输量

三、诊断流程图

接到“系统慢了”的反馈

       ↓

第一步:看磁盘I/O(iostat -x 1)

       ↓

  %util>80% 或 wa>10%?

       ↓ 是               ↓ 否

  解决磁盘问题     第二步:看内存(free -h)

       ↓                    ↓

                     内存不足 或 Swap活动?

                           ↓ 是       ↓ 否

                     解决内存问题  第三步:看CPU(top)

                                       ↓

                                  us高? sy高? 负载高?

                                       ↓

                                  查慢查询SQL、执行计划

                                       ↓

                                  第四步:看网络(如有需要)

四、一个真实案例

某电商系统在促销期间突然响应变慢,DBA看到top里CPU使用率85%,第一反应是“CPU瓶颈,要加核”。

但仔细看top的输出:wa(iowait)占了30%。这意味着CPU有30%的时间在“等磁盘”,不是在“算数据”。

用iostat -x 1一看,磁盘%util长期在95%以上,await超过50ms。根因是某张表的统计信息过旧,导致优化器选错了执行计划,频繁触发全表扫描,把磁盘打满了。

解决方案:执行ANALYZE TABLE更新统计信息,查询走了正确的索引,磁盘I/O从95%降到30%,CPU使用率从85%降到40%。系统恢复正常。

复盘:如果只看CPU高就去加核,问题根本解决不了——加再多核,CPU还是在等磁盘。

五、总结

遇到性能问题,不要一上来就翻慢查询日志。先按这个顺序排查:

1. 磁盘I/O —— 最常见、最容易被误判的瓶颈。先看iostat和wa,解决了I/O问题,很多“CPU高”问题自然消失。

2. 内存 —— 内存不足导致Swap,性能直接崩盘。先看free -h和vmstat。

3. CPU —— 排除了I/O和内存再看CPU。us高查SQL,sy高查连接和锁,wa高回到第一步。

4. 网络 —— 分布式架构中不可忽视,集中式架构中优先级最低。

记住一句话:先系统后数据库,先资源后SQL。 系统层亮了红灯,就别在数据库层浪费时间。

小耶在手,SQL 不愁

还有什么想了解的,欢迎留言!小耶一定知无不言言无不尽……我们下次见~

相关文章
|
2月前
|
存储 固态存储 关系型数据库
从月账单5万到3.5万:云数据库成本优化的完整复盘
上云本应是降本增效,但很多企业上云之后,账单反而越滚越大。实例规格买高了、历史数据堆在SSD上、测试环境没人关、过期快照没清理——每一笔费用都在悄悄累积。本文从云账单的三大“黑洞”出发,拆解云成本失控的根因,给出实例降配、冷热数据分层、僵尸资源清理三条可落地的优化路径,帮助DBA和运维工程师用数据驱动成本优化,让每一分钱都花在刀刃上。
四色
四色
1734 5
|
25天前
|
SQL 监控 关系型数据库
MySQL索引合并优化器陷阱:为什么复合索引比索引合并快一个数量级?
MySQL优化器有一个“自作聪明”的行为——当单列索引无法完全覆盖查询时,它可能选择索引合并(Index Merge) ,同时使用多个单列索引,把结果集合并起来。听起来很合理对吧?但索引合并有严格的适用条件,用错了比全表扫描还慢——尤其是UNION类型的索引合并,需要对多个结果集去重和排序,代价极高。本文拆解索引合并的3种类型、3个踩坑场景,以及什么时候该用复合索引替代。
|
26天前
|
存储 缓存 运维
数据库慢了就堆硬件?三维选型框架+4条避坑告诉你高性价比数据库一体机怎么选
业务增长、数据库扛不住,传统“加硬件”方案为何屡屡失效?数据库一体机的“软硬协同”到底解决了什么问题?如何用一套方法论选出高性价比方案?本文从问题根源、技术原理、市场产品到选型框架,一次性把数据库一体机这件事讲透。
|
1月前
|
存储 SQL 容灾
共享存储集群 vs 分布式多副本:同城双活两条技术路线怎么选?
同城双活正在成为金融、政务等核心系统的容灾标配——RPO=0、RTO<30秒。但真正的落地远不止“两个机房各放一套数据库”那么简单。网络延迟的容忍度、脑裂预防机制、同步复制的性能代价、以及故障切换后的数据回滚,每一个环节都可能成为“最后一公里”的绊脚石。本文从容灾架构演进入手,拆解同城双活的核心技术原理、关键挑战与应对方案,并结合同城双中心方案及实测数据进行深度解析。
|
1月前
|
SQL 运维 关系型数据库
2026年分布式数据库有哪些主流选择?先评估这5个维度再决定
分布式数据库选型,99%的文章在列表格比参数——但真正的决策关键不在厂商PPT里,在上线后的真实运维里。本文从网络延迟容忍度、SQL兼容性验证、在线扩容能力、全局索引代价、运维工具链成熟度5个维度出发,给出可落地的评估方法和决策建议,帮助你在选型阶段避开那些“只有上线后才会发现”的坑。
|
2月前
|
存储 架构师 数据库
从DBA到数据架构师:技术债务管理是分水岭
“架构债”在业务快速迭代中被不断放大,最终成为系统稳定性的定时炸弹。本文从数据架构的视角出发,拆解数据库技术债务的四种典型类型,提供识别、评估和偿还的完整方法论,帮助读者从“数据库管理员”升级为“数据架构师”。
|
2月前
|
SQL 缓存 NoSQL
Redis缓存三大坑:穿透、击穿、雪崩,一次讲透
缓存穿透、击穿、雪崩,名字像兄弟但成因解法完全不同。本文深入讲解三种问题的原理、实现细节与隐藏的坑,覆盖布隆过滤器、互斥锁、逻辑过期、过期随机化等解法。
|
2月前
|
SQL 关系型数据库 MySQL
EXPLAIN显示FirstMatch?优化器已经帮你做了半连接,别再盲目改JOIN了
IN和EXISTS子查询为什么有时候快、有时候慢?很多人说“子查询慢,改成JOIN就快了”,但MySQL 5.6+引入了半连接优化后,这个说法已经不完全成立了。本文从半连接(Semi-Join)的核心概念出发,拆解MySQL优化器的5种半连接执行策略,通过真实案例展示半连接何时生效、何时失效,以及如何通过执行计划判断优化器的决策,帮助读者从“盲目改写法”升级到“看懂优化器在做什么”。
|
2月前
|
SQL JSON 移动开发
SQL派生表优化实战:从物化机制到LATERAL JOIN的完整进阶
很多人只知道“子查询改JOIN就快了”,但不知道为什么,也不知道什么时候该改、什么时候不该改。本文从派生表的物化机制出发,拆解临时表膨胀、索引失效的根因,通过真实案例对比派生表、CTE、LATERAL JOIN三种写法的性能差异,帮助读者从“知道现象”升级到“理解原理”。