判断服务器哪个部分慢,核心思路是先看系统资源总览,再用排查命令逐层锁定,大多数情况是CPU、内存、磁盘I/O、网络带宽这四类中的某一个先被打满。
先看响应时间还是吞吐量?
很多人一上来就盯着CPU百分比,其实搞错顺序了,服务器慢,用户感受到的是“请求半天不出结果”,我们要先区分是单个请求慢,还是整体并发时变慢,这个差异决定排查方向。
访问一个页面要等好几秒,但并发人数不多,这种多半是后端逻辑、数据库查询或者第三方接口拖了后腿。
平时正常,一到高峰期就卡死,这种要考虑带宽跑满、连接数超限或者内存不够导致频繁交换分区。
行业共识认为,排查前先问自己三个问题:慢是持续性的还是间歇性的? 单机慢还是所有节点都慢? 慢在哪个时间段? 这三个答案能帮你过滤掉一半干扰因素。
服务器慢是CPU还是内存拖后腿?
打开终端输入top,第一眼就能看到CPU和内存的使用情况,但别只看百分比,有技巧。
看CPU的负载和等待时间
top输出里有几个关键字段:
- us(用户态):应用代码在跑,如果这数值长期超过70%,说明CPU被业务逻辑吃满了。
- sy(系统态):内核在干活,偏高可能意味着系统调用频繁,或者有中断风暴。
- wa(I/O等待):这个数字一旦超过30%,CPU在等磁盘,问题根本不在CPU本身。
- st(被偷走的时间):云服务器常见,说明你的CPU被宿主机上的其他虚拟机抢占了。
如果top里有个进程CPU占用高达100%,直接top -H -p 进程号看线程,再配合

jstack(Java应用)或perf抓热点,比如Java进程CPU飙高,用jstack抓线程转储,经常能看到GC线程卡死或者死循环代码。
内存不足藏在swap里
内存不足不一定表现为内存用满,而是系统开始使用swap,执行free -h,重点看swap的used值,如果数值一直在涨,说明物理内存已经不够用,系统在拿磁盘当内存,性能直接下降一个数量级。
还有一种情况:内存明明没用多少,但swap占用高,这往往是应用申请了内存但长期不释放,或者系统开启了过度使用策略,检查/proc/sys/vm/swappiness,把它调到10左右可以缓解。
排查命令量化一下:
top -b -n 1 | head -20 # 看CPU和负载 free -h # 看内存和swap vmstat 1 5 # 看页面换入换出
磁盘I/O和网络延迟怎么区分?
这两个问题症状相似,都表现为“页面转圈但CPU不高”,区分方法很简单:磁盘慢系统会卡在执行某个动作上,网络慢是数据传不回来。
用iostat定位磁盘瓶颈
执行iostat -x 1 3,盯着两个指标:
- %util:磁盘忙碌程度,接近100%说明磁盘一直在干活。
- await:请求平均等待时间,普通SATA磁盘超过20ms就偏慢,SSD超过10ms需要警惕。
如果磁盘慢,先看有没有进程在做大量读写。iotop能直接列出占用磁盘最高的进程,常见凶手有:MySQL的慢查询刷盘、日志写入过多、定时任务里的全量扫描。
举例说明,一个网站在每天凌晨3点卡顿,iostat显示vda利用率100%,用iotop查到是logrotate在压缩日志,这就不是硬件故障,是任务调度问题,把日志压缩时间挪到低峰期就能解决。

网络延迟的检查路径
网络慢要区分局域网和公网,先看网卡流量:
sar -n DEV 1 5
rxpck/s和txpck/s超过网卡理论值的一半,基本就是流量瓶颈,再看丢包率,ping网关如果有丢包,说明内网有故障;ping外部IP丢包,可能是运营商线路问题。
判断网络还是磁盘更直接的方法是curl -w,对本地服务做请求,加一个“时间分解”:
curl -o /dev/null -s -w '连接时间: %{time_connect}sn响应时间: %{time_starttransfer}sn' http://localhost
如果time_connect时间很长,是网络问题;如果time_starttransfer长,是服务器处理慢,跟网络没关系。
数据库查询慢怎么判断?
前面几步把系统资源排除了,那十有八九是SQL出了毛病,数据库服务器CPU不高、内存足够,但接口就是慢,重点看慢查询日志。
以MySQL为例,开启慢查询日志并设置阈值:
SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time = 1;
然后分析日志里记录到的语句,用EXPLAIN SELECT ...看执行计划,看到全表扫描(type=ALL)或者临时表(Using temporary),就是索引缺失或者SQL写法有问题。
更省事的做法是直接用performance_schema里的events_statements_summary_by_digest表,按平均耗时排序,挑出最慢的TOP SQL,同时检查数据库连接数,SHOW STATUS LIKE 'Threads_connected',连接数接近max_connections时,新请求会排队,表现就是“服务器慢但CPU闲着”。
用真实场景串一遍排查流程

假设一台云服务器最近几天老是卡顿,用户反馈打开页面要5秒,按下面顺序来:
- 看
uptime,负载如果是5(单核),说明系统已经过载。 - 再跑
top,发现wa高达40%,CPU在等I/O。 - 接着跑
iostat -x,磁盘%util长期100%,await达到80ms。 - 再查
iotop,发现MySQL的线程在大量写binlog和临时表。
到这里已经定位:瓶颈是磁盘I/O,不是CPU也不带宽,接下来看是否磁盘满了(df -h),或者表数据量太大没有索引,清理硬盘、优化SQL或升级SSD,问题解决。
这种排查顺序比盲目调优高效得多,如果你租的是共享型云主机,还要多看一眼主机规格,共享型CPU会被限流,高峰期涨慢正常,百度云和简米云的轻量服务器都有这个特性。
Q&A:服务器哪个部分慢怎么快速定位?
问:用Windows服务器的时候,任务管理器能看到瓶颈吗?
任务管理器只能看个大概,CPU、内存、磁盘、网络四个图表能帮你缩小范围,但看不到进程级的线程细节,建议用perfmon捕获计数器:Processor% Processor Time、MemoryAvailable MBytes、PhysicalDiskAvg. Disk Queue Length,再结合应用日志判断。
问:为什么服务器CPU只有20%但页面还是慢?
CPU占用低说明瓶颈不在计算能力,先看磁盘I/O等待和网络延迟,再看数据库锁等待,有一种隐蔽情况是单线程应用,比如Redis或者老旧的PHP程序,一个核忙到100%其他核闲着,整体CPU显示很低,但性能其实被单线程卡住了,此时按连接数排查具体请求,看是不是某个请求持有锁或者做了长轮询。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/852825.html


评论列表(4条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是磁盘部分,给了我很多新的思路。感谢分享这么好的内容!
@萌黑9754:读了这篇文章,我深有感触。作者对磁盘的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于磁盘的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于磁盘的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!