哈喽大家~ 今天跟大家分享的是Linux卡顿的排查方法,建议大家认真看完并收藏起来,以后遇到卡顿,直接拿出来照做就行!
做运维、搞研发的,谁没被服务器卡顿坑过?我敢说,十个运维九个都有过这种崩溃瞬间:
服务器突然就卡了,接口超时转圈;远程登录输个命令,半天没反应;明明没部署新东西,CPU、内存却蹭蹭往上涨,紧急赶项目的时候掉链子,急得抓耳挠腮,却不知道从哪下手。
其实不是咱们技术不行,是没找对排查思路!
服务器卡顿看着吓人,实则有固定套路,一步一步来,不用装那些花里胡哨的插件,用的都是Linux自带命令,新手也能快速定位问题,不用再熬夜背锅。
今天这篇,我把平时排查卡顿的全套流程,连带着踩过的坑、藏着的小技巧,全给你们扒出来 —— 全套完整的Linux服务器卡顿排查流程,从简单到复杂,从基础到核心,不管是CPU飙满、内存爆满,还是进程异常、磁盘拖慢,都能快速找到元凶,高效解决。
我保证,看完这篇文章,小白也可以轻松上手,下次再遇到卡顿,你就敢拍胸脯说“我来搞定”!
先搞懂:服务器卡顿,大概率是这4个原因
排查前,先花30秒判断个大概方向,不用盲目操作,节省一半时间。
首先你要清楚:Linux 性能是由CPU、内存、磁盘IO、网络四种资源决定,遇到的卡顿问题,肯定逃不出这4种情况:
- ✅ CPU 飙满:最常见!大概率是某个进程异常占用,比如程序死循环、恶意脚本,或者备份、数据同步等批量任务堆在一起执行,直接把CPU干满;
- ✅ 内存爆满:要么是程序内存泄漏(这个最坑,慢慢耗光内存),要么是开了太多大程序、缓存堆太多,服务器直接“卡壳”;
- ✅ 磁盘 I/O 过高:最容易被忽略!磁盘读写太频繁(日志疯狂写入、大量文件传输、数据库高频读写),哪怕CPU、内存都正常,服务器也会卡顿;
- ✅ 网络堵塞:端口被异常进程占用、带宽跑满(比如恶意攻击、偷偷下载大文件),数据传不出去,接口自然超时。
记住这4个方向,排查起来就有针对性,不用东找西找瞎忙活!
核心排查流程:5步搞定,照着做就对了
重点提醒:不用装额外插件,全是Linux自带命令,直接复制粘贴就行!
第一步:先看整体状态,快速定位大方向
登录服务器后,先输这top,可以快速摸清服务器的“底细”,判断是CPU、内存还是磁盘的问题:
重点看3个地方,一眼就能判断核心问题,记好:
-
%Cpu(s):CPU 使用率,超过80%就说明有问题,接近100%就是CPU爆满,赶紧查进程;
-
KiB Mem:内存使用情况,重点看 used 和 available,available 是可用内存,要是低于10%,就是内存不足;
-
PID 列:最前面、%CPU 最高的那个进程,大概率就是“罪魁祸首”,重点盯它。
小技巧:按“M”(大写),按内存使用率排序;按“P”(大写),按CPU使用率排序,快速找到占用最高的进程,不用一个个找。看完按“q”退出就行。
补充个小细节:如果 top 里看到 load average(负载)数值,超过服务器CPU核心数,也说明服务器压力大,比如4核CPU,负载超过4,就属于异常。
第二步:排查CPU异常
-
如果 top 命令看到 CPU 飙高,别慌,按下面步骤来,快速定位异常进程,安全解决。
先查 CPU 占用前10的进程,直接复制这条命令,不用改,执行就完了:ps -ef | sort -k 3 -r | head -10别光复制不明白:ps -ef 是查看所有进程,sort -k 3 -r 是按CPU使用率倒序排列,head -10 是只显示前10个。重点看 COMMAND 列(进程名称)和 %CPU 列,陌生进程、占用率特别高的,重点怀疑。
-
定位到异常进程后,先别急着杀,先看看它在做什么,避免杀错,命令直接复制,把“进程ID(PID)”换成你查到的数字就行:
ps -aux | grep 进程ID(PID)比如 PID 是1720,就输 ps -aux | grep 1720,能看到进程的具体操作、占用的资源,判断它是不是无用进程、异常进程。 -
临时解决(紧急情况用):如果确定是无用进程、异常进程(比如陌生脚本、死循环程序),直接杀死,命令记好:kill -9 进程ID(PID)
重点提醒!核心进程(比如 nginx、mysql、sshd、systemd)别乱杀,杀错sshd,你就远程登不上服务器了;杀错mysql,业务直接停摆。不确定就先查清楚进程用途,评论区问我也可以,别瞎操作。
一个个我踩过的坑:有一次CPU飙满,我没看清楚,把nginx进程杀了,导致业务停摆。后来我就养成习惯,杀进程前,必用ps -aux查清楚用途,再动手。
另外,很多时候 CPU 飙高,不是恶意进程,就是定时任务叠加,比如备份任务和数据同步任务同时执行,这时候不用杀进程,先停止其中一个,等完成后再执行另一个,卡顿就缓解了。
第三步:排查内存异常
如果 top 看到内存快满了,available 特别低,别着急加内存,先排查——很多时候是缓存太多,或者某个进程异常占用,清理一下就好,省成本又省事。
-
先查看内存详细使用情况,直接复制命令,执行后一目了然:
free -h重点看 available(可用内存),如果 available 低于10%,就是内存不足,需要清理;如果 used 很高,但 available 也不低,说明是缓存占用,不用慌,清理缓存就行。
-
查看内存占用前10的进程,和CPU排查类似,命令改个参数就行,直接复制:
ps -ef | sort -k 4 -r | head -10解释一下:sort -k 4 是按内存使用率倒序,找到占用内存最高的进程,重点排查是不是程序内存泄漏(比如Java程序,内存一直涨,不释放)。
-
内存清理(安全不删核心数据,放心用):如果是缓存占用,执行这条命令,清理后可用内存会明显增加:
sync && echo 3 > /proc/sys/vm/drop_caches跟大家说清楚,这条命令清理的是系统缓存,不会删除业务数据、日志,安全可用,我每天都会执行一次,避免缓存堆积。
第四步:排查磁盘 I/O 异常
我遇到过好几次,CPU、内存都正常,但服务器就是卡顿,远程登录都卡,最后排查下来,全是磁盘 I/O 过高惹的祸——磁盘读写太频繁,拖慢了整个系统,这种情况最容易被忽略!
-
先查看磁盘 I/O 占用情况,直接复制命令,执行后就能看到:
iostat -x 1 3重点看两个地方:%util 列(磁盘使用率),超过80%就是 I/O 异常,数值越高,磁盘压力越大;tps 列(每秒读写次数),数值过高,说明磁盘读写太频繁。补充一句:如果没找到iostat命令,说明系统没装sysstat工具,执行 yum install sysstat -y(CentOS)或apt install sysstat -y(Ubuntu),装完就能用,很简单。
-
查看具体哪个磁盘、哪个进程占用 I/O 过高,用这条命令,直观又方便:
iotop操作技巧:按“o”,只显示有 I/O 活动的进程;按“P”,按进程 I/O 使用率排序,快速找到“罪魁祸首”,比如某个日志进程、文件传输进程。 -
临时解决:停止异常读写进程(比如大量日志写入、文件传输),或者清理无用大文件(比如/var/log目录下的旧日志、临时文件),缓解磁盘压力。
实用小技巧:平时一定要定期清理日志,我一般每周清理一次/var/log目录下的旧日志,用 rm -rf /var/log/*.log(谨慎操作,别删错),或者用日志轮转工具,避免日志占满磁盘,导致 I/O 过高。另外,尽量别在服务器上存大文件、做大量文件传输,容易拖慢磁盘。
第五步:排查网络异常
如果前面3步都正常,CPU、内存、磁盘都没问题,但接口还是超时、卡顿,就排查网络,大概率是端口占用、带宽跑满,或者网络不通。
-
查看端口占用情况,这条命令平时用得最多,直接复制,能看到所有监听端口:
netstat -ntlp重点看:LISTEN 状态的端口,有没有异常端口占用(比如陌生端口、非业务端口),或者业务端口被多个进程占用(比如80端口,被两个nginx进程占用),这种情况会导致接口超时。补充:如果没找到netstat命令,执行 yum install net-tools -y 或 apt install net-tools -y,装完就能用。
-
查看网络带宽使用情况,用这条命令,能看到每个IP的带宽占用:
iftop重点看:有没有异常IP占用大量带宽(比如恶意攻击IP、陌生IP),如果有,直接拉黑IP,或者联系服务商限制带宽。 -
临时解决:关闭异常端口、杀死占用带宽的进程,或者联系服务商调整带宽;如果是网络不通,用 ping、traceroute 命令,排查网络链路问题。
小技巧:3个避坑点,新手必看
这些年我排查卡顿踩过的坑,分享给大家,避免走弯路、背锅,每一条都很实用:
- ❌ 别盲目重启服务器!很多朋友遇到卡顿,第一反应就是重启,重启确实能临时解决,但会丢失异常日志,下次还是会出问题,而且如果是核心业务服务器,重启会导致业务停摆,损失更大。记住:先排查,找到问题,再重启(万不得已再重启)。
- ❌ 核心进程别乱杀!刚才反复强调,sshd、mysql、nginx、systemd这些核心进程,杀错就翻车,不确定进程用途,就用ps -aux | grep 进程ID查清楚,或者评论区问我,别瞎动手。
- ✅ 定期清理缓存和日志,做好监控!每周清理一次系统缓存、旧日志,能有效减少服务器卡顿概率;另外,一定要装监控(比如Prometheus+Grafana),实时盯着CPU、内存、磁盘、网络,有异常提前告警,不用等出问题再排查。
案例:10分钟搞定服务器卡顿,避免背锅
去年帮一个团队排查服务器卡顿,他们服务器突然变慢,远程登录都要等1分钟,接口全部超时,用户投诉不断,急得不行。
我远程登录上去,按上面的流程排查,10分钟就搞定了,全程没翻车:
- 先输 top 命令,发现 CPU 直接飙到99%,按“P”排序,看到一个陌生进程(xxx.sh),占用90%+ CPU,其他进程占用都很低;
- 输 ps -aux | grep 进程ID 查看,发现是一个错误的定时任务,研发不小心写的脚本,一直在循环执行,而且没做限制,直接把CPU干满了;
- 输 kill -9 进程ID,杀死异常进程,再输 top 一看,CPU瞬间降到10%以内,服务器立马不卡了;
- 执行 sync && echo 3 > /proc/sys/vm/drop_caches清理缓存,再检查定时任务(crontab -l),删除错误任务,服务器恢复正常,接口响应也变快了。
其实很多服务器卡顿,都不是什么大问题,不是进程异常,就是资源占用过高,只要按流程排查,找到“罪魁祸首”,就能快速解决,不用熬夜排查,更不用背锅。