作为一名Linux运维工程师,最让人头皮发麻的场景莫过于:凌晨三点被监控告警电话惊醒,被告知业务系统响应延迟超过10秒;或者白天上班时,开发同事集体反馈“服务器又卡了”。这种突发的卡顿问题,往往没有明显预兆,却直接影响业务连续性——电商系统卡顿可能导致订单流失,IoT平台卡顿会造成数据采集中断,后台服务卡顿则会引发全链路超时。
很多新手遇到这种情况会手足无措,要么盲目重启服务器(大概率治标不治本),要么对着满屏日志发呆。其实,Linux服务器的多数卡顿问题,都能通过“top+netstat+df”这三条基础命令快速定位。我曾靠这“三板斧”,在5分钟内解决过双11期间的数据库服务器卡顿问题,也帮过刚入行的同事排查出被挖矿程序占用资源的隐患。今天就结合三个真实案例,把这三条命令的实战用法讲透,让你遇到服务器卡顿再也不慌。
在动手排查前,我们得先明确一个逻辑:服务器卡顿本质是“资源供需失衡”——CPU、内存、磁盘I/O、网络带宽这四大核心资源中,至少有一项被过度占用,导致业务进程无法获得足够资源运行。
常见的卡顿场景主要分四类:一是CPU被高负载进程占满,比如异常的Java进程或挖矿程序;二是内存耗尽引发大量Swap交换,导致进程响应迟缓;三是磁盘I/O瓶颈,比如日志写入过于频繁或磁盘故障;四是网络堵塞,比如遭遇SYN洪水攻击或端口被异常连接占满。
而top、netstat、df这三条命令,恰好对应这些核心资源的排查:top聚焦CPU和内存,netstat专攻网络连接,df则锁定磁盘空间问题。掌握它们的组合用法,就能形成“从资源占用到问题定位”的完整闭环。下面我们从实战场景出发,一步步拆解操作。
top命令是Linux系统的“资源监视器”,执行后会实时显示进程的CPU、内存占用情况,默认按CPU使用率排序。遇到服务器卡顿时,第一步就该用它判断“是不是计算资源被耗尽了”。
直接在终端输入top,会出现如下核心输出(关键信息已标注):
top - 09:23:45 up 120 days, 3:15, 2 users, load average: 12.50, 8.30, 5.10
Tasks: 286 total, 3 running, 283 sleeping, 0 stopped, 0 zombie
%Cpu(s): 98.2 us, 1.5 sy, 0.0 ni, 0.0 id, 0.2 wa, 0.0 hi, 0.1 si, 0.0 st
KiB Mem : 32786848 total, 1254368 free, 28567480 used, 2965000 buff/cache
KiB Swap: 16777212 total, 8965344 free, 7811868 used. 3568928 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 root 20 0 8582468 7.2g 12348 R 99.8 23.1 12:35.67 java
5678 mysql 20 0 6291456 2.1g 87652 S 45.2 6.6 08:12.45 mysqld
9012 www 20 0 152348 12456 8972 R 12.5 0.0 0:03.21 nginx这几行输出藏着卡顿的关键线索,我们重点看三个部分:

默认的top输出信息较多,我们可以用快捷键优化显示:

去年双11前,公司的订单系统服务器突然卡顿,接口响应时间从500ms飙升到5s。我登录服务器后立即执行top命令,发现一个java进程CPU占用100%,内存占用也达到80%。
下一步就是定位该Java进程的具体问题线程。通过ps -mp 1234 -o THREAD,tid,time命令(1234为Java进程PID),找到占用CPU最高的线程PID(假设为1240);然后用printf "%x\n" 1240将线程PID转为十六进制(结果为4d8);最后执行jstack 1234 | grep 4d8 -A 30,查看该线程的堆栈信息,发现是一个订单统计的定时任务出现死循环,导致CPU被耗尽。
解决方法很简单:先通过kill -9 1234重启Java服务,临时恢复业务;再修改定时任务的逻辑,避免死循环。整个排查过程不到10分钟,比盲目重启服务器更彻底。
如果top命令显示CPU和内存占用都正常,那卡顿很可能出在网络上——比如服务器遭遇网络攻击,或者某个服务的连接数超出上限。这时候,netstat命令就能派上用场,它能列出所有网络连接状态,帮我们找出异常连接。
netstat的参数很多,排查卡顿最常用的组合是netstat -tuln(查看监听端口)和netstat -an | grep ESTABLISHED(查看已建立连接),以及netstat -an | grep SYN_RECV(查看半连接状态)。
我们先拆解关键参数:
网络导致的卡顿,通常和以下三类异常连接有关,用netstat就能快速识别:
netstat -an | grep SYN_RECV | wc -l,如果结果超过几百,大概率是遭遇了SYN洪水攻击。这种攻击通过发送大量半连接请求,耗尽服务器的连接资源,导致正常请求无法建立。
netstat -an | grep :8080 | grep ESTABLISHED | wc -l,发现8080端口(假设是Web服务端口)连接数从平时的几十飙升到几千,可能是服务出现内存泄漏,导致连接无法释放,或者遭遇了CC攻击。
netstat -an | grep ESTABLISHED | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr,可以统计每个IP的连接数。如果某个陌生IP的连接数占比超过50%,很可能是恶意连接。
有一次,公司的API服务器突然卡顿,top命令显示CPU和内存都很正常,于是转向网络排查。执行netstat -an | grep :80 | grep ESTABLISHED | wc -l,发现80端口的连接数从平时的200左右涨到了3000+。
接着用连接数统计命令,发现一个来自境外的IP,连接数高达2800。初步判断是CC攻击,立即通过iptables -I INPUT -s 恶意IP -j DROP封禁该IP,同时执行service nginx restart重置Web服务连接。5分钟后,服务器卡顿缓解,80端口连接数恢复正常。
为了避免后续攻击,我还配置了nginx的连接限制:在nginx.conf中添加limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn perip 10;,限制每个IP最多10个并发连接,从根本上防范类似攻击。
很多人容易忽略磁盘空间问题,但实际上“磁盘满导致服务器卡顿”的场景非常常见。当磁盘空间使用率达到100%时,系统无法写入日志、临时文件,进程会陷入等待状态,表现为服务器卡顿甚至服务崩溃。df命令就是检查磁盘空间的“标配工具”。
最常用的命令是df -h,“-h”参数会以“GB”“MB”等人类易读的单位显示磁盘信息,输出如下:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 38G 2.0G 95% /
/dev/vdb1 100G 50G 50G 50% /data
tmpfs 16G 0 16G 0% /dev/shm核心关注“Use%”列,通常磁盘使用率超过90%就需要警惕,超过95%很可能导致卡顿。案例中“/”分区(根分区)使用率达95%,是明显的风险点。
df命令只能看到分区占用,要找到具体的大文件,需要结合du命令。比如根分区满了,可按以下步骤定位:
cd /
du -sh *(“-s”显示总和,“-h”人性化显示),找到占用最大的目录(比如/var)。
cd /var,再次执行du -sh *,发现是/var/log日志目录占用20G。
ls -lh /var/log | sort -k5 -nr,按文件大小排序,找到占用最大的日志文件(比如nginx的access.log)。
一次MySQL数据库服务器卡顿,执行mysql -u root -p连不上数据库,报错“Can’t create/write to file ‘/tmp/#sql_1234.MYI’”。立即执行df -h,发现根分区使用率100%。
通过du命令排查,定位到/var/log/mysqld.log日志文件占用35G——原来是MySQL开启了全量日志,且没有配置日志轮转,导致日志文件不断增大,占满了根分区。
解决步骤分两步:一是临时释放空间,二是永久解决日志问题。临时释放:先备份日志cp /var/log/mysqld.log /data/backup/,再清空日志echo "" > /var/log/mysqld.log(注意不能用rm删除正在写入的日志文件,否则会导致服务异常);永久解决:编辑MySQL配置文件vim /etc/my.cnf,添加日志轮转配置,同时关闭不必要的全量日志,只保留错误日志和慢查询日志。操作完成后,MySQL恢复正常,服务器卡顿问题彻底解决。
通过以上三个案例,我们可以总结出Linux服务器卡顿的“标准化排查流程”,按这个顺序操作,能最大程度提高效率:
同时,分享几个运维老手的避坑指南:
很多新手沉迷于复杂的监控工具和自动化平台,却忽略了top、netstat、df这些基础命令的强大。但实际上,在服务器突发卡顿的场景中,这些命令往往是最高效的排查工具——它们不依赖任何额外组件,随系统自带,操作简单直接,能快速定位核心问题。
运维的核心能力不是“会用多少工具”,而是“能快速解决问题”。把top、netstat、df这三条命令的用法练熟,理解它们背后的资源监控逻辑,再结合实战案例积累经验,你就能在面对Linux服务器卡顿问题时,从“手足无措”变成“从容应对”。
最后,欢迎在评论区分享你遇到的服务器卡顿案例,以及你的排查方法
这篇博客包含了详细的命令解析、实战案例和排查流程,符合CSDN技术博客的需求。如果你觉得某个案例需要补充更多细节,或者想增加其他相关命令的讲解,都可以随时告诉我。