Linux 排查工具(top/free/df/netstat)?

2025年 阅读约 12 分钟 面试指南 · Linux/Docker

深入解析Linux排查工具:top/htop(CPU和内存监控)、free(内存分析)、df/du(磁盘空间)、netstat/ss(网络连接)、iostat/vmstat(IO和系统性能),附面试模拟问答。

一句话总结

Linux 排查四件套:CPU/内存用 top/htop(看负载、CPU 使用率、内存占用、进程排序),内存用 free -h(看 total/used/free/available,available 才是真正可用),磁盘用 df -h(看分区使用率)和 du -sh *(看目录大小),网络用 netstat -antp 或 ss -antp(看监听端口和连接状态)。进阶:IO用 iostat -x 1(看磁盘读写负载),整体用 vmstat 1(看 CPU/内存/IO/系统综合指标)。

初级理解

top — CPU 和内存监控

# top 输出解读: top - 10:30:15 up 30 days, 2:15, 2 users, load average: 0.52, 0.38, 0.25 # 当前时间 运行30天 2用户 1/5/15分钟平均负载 Tasks: 156 total, 1 running, 155 sleeping, 0 stopped, 0 zombie # 进程总数 运行中 睡眠 停止 僵尸 %Cpu(s): 2.5 us, 1.0 sy, 0.0 ni, 96.0 id, 0.3 wa, 0.0 hi, 0.2 si, 0.0 st # us=用户态 sy=内核态 id=空闲 wa=IO等待 st=虚拟机偷取 MiB Mem : 7856 total, 456 free, 3456 used, 3944 buff/cache # 总内存 空闲 已用 缓存 MiB Swap: 2048 total, 1890 free, 158 used. 3890 avail Mem # 交换分区 空闲 已用 可用内存(含可回收缓存) # top 交互命令: # 1:显示每个 CPU 核心 # M:按内存排序 # P:按 CPU 排序 # c:显示完整命令行 # k:输入 PID 终止进程 # q:退出 # 关键指标: # load average:1/5/15 分钟平均负载 # < CPU 核心数:正常 # > CPU 核心数:过载 # wa(IO wait):高说明磁盘 IO 瓶颈 # st(steal):高说明虚拟机资源被宿主机抢占

free — 内存分析

# free -h 输出解读: total used free shared buff/cache available Mem: 7.7G 3.4G 456M 123M 3.9G 3.8G Swap: 2.0G 158M 1.8G # 关键理解: # free:完全未使用的内存(小是正常的,Linux 会利用空闲内存做缓存) # buff/cache:文件系统缓存(可回收) # available:真正可用的内存 = free + 可回收的 buff/cache # 判断内存是否够用看 available,不是 free! # 内存不足的表现: # 1. available 很低(< 10% 总内存) # 2. Swap used 持续增长 # 3. OOM Killer 开始杀进程 # 查看内存使用排行: ps aux --sort=-%mem | head -10 # 按内存使用率降序,前 10 个进程

中级深入

df/du — 磁盘空间

# df:查看文件系统磁盘使用情况 df -h # Filesystem Size Used Avail Use% Mounted on # /dev/sda1 50G 30G 18G 63% / # /dev/sdb1 100G 80G 15G 85% /data # df -i:查看 inode 使用情况 # 小文件太多可能 inode 耗尽(磁盘有空间但无法创建文件) # du:查看目录/文件大小 du -sh * # 当前目录下每个文件/目录的大小 du -sh /var/log/ # 指定目录大小 du -h --max-depth=1 # 一层子目录大小 # 查找大文件: find / -type f -size +100M -exec ls -lh {} \; # 查找大于 100M 的文件 # 磁盘满了排查: # 1. df -h 确认哪个分区满了 # 2. du -sh /* 逐层排查大目录 # 3. 常见原因:日志文件(/var/log)、临时文件(/tmp)

netstat/ss — 网络连接

# netstat(传统工具) netstat -antp # -a:所有连接(含监听) # -n:数字格式(不解析域名) # -t:TCP # -p:显示进程 # 输出列: # Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program # TCP 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1234/java # 常用组合: netstat -antp | grep 8080 # 查看 8080 端口 netstat -antp | grep LISTEN # 查看所有监听端口 netstat -ant | awk '{print $6}' | sort | uniq -c # 统计各状态连接数 # ss(推荐,比 netstat 更快) ss -antp # 同 netstat -antp ss -s # 统计摘要 ss -lntp # 只看监听端口 # 连接状态统计: ss -ant | awk '{print $1}' | sort | uniq -c # 大量 TIME_WAIT → 短连接过多 # 大量 CLOSE_WAIT → 程序未关闭连接

高级进阶

iostat — 磁盘 IO 监控

# iostat -x 1(每秒刷新) iostat -x 1 # 关键指标: # r/s, w/s:每秒读写次数 # rkB/s, wkB/s:每秒读写数据量 # await:平均每次 IO 等待时间(ms) # < 10ms:正常 # 10-30ms:偏高 # > 30ms:IO 瓶颈 # %util:磁盘利用率 # 接近 100%:磁盘繁忙 # IO 瓶颈排查: # 1. iostat -x 1 看 await 和 %util # 2. iotop 看哪个进程 IO 高 # 3. 优化:加内存缓存、换 SSD、读写分离

vmstat — 系统综合性能

# vmstat 1(每秒刷新) vmstat 1 # 输出列: # r:运行队列(> CPU 核心数说明 CPU 瓶颈) # b:阻塞进程(等待 IO) # swpd:使用的 Swap(持续增长说明内存不足) # free:空闲内存 # si/so:Swap 换入/换出(> 0 说明内存不足) # us/sy/id/wa:CPU 使用率 # wa > 10%:IO 瓶颈 # us + sy > 90%:CPU 瓶颈 # 综合排查思路: # 1. top → 看 CPU 和内存整体情况 # 2. free -h → 看内存是否够用 # 3. df -h → 看磁盘是否满了 # 4. iostat -x 1 → 看磁盘 IO 是否有瓶颈 # 5. netstat/ss → 看网络连接是否正常 # 6. vmstat 1 → 看系统综合指标

实战场景

# 场景1:CPU 100% 排查 # 1. top 找到 CPU 最高的进程 PID # 2. top -H -p PID 查看该进程的线程 # 3. 将线程 ID 转 16 进制 # 4. jstack PID | grep 16进制线程ID -A 30 # 5. 定位到具体代码行 # 场景2:内存溢出排查 # 1. top 看内存使用率 # 2. ps aux --sort=-%mem | head -5 找内存大户 # 3. jmap -heap PID 看堆内存 # 4. jmap -histo PID | head -20 看对象统计 # 5. 必要时 jmap -dump:format=b,file=heap.hprof PID # 场景3:磁盘满了排查 # 1. df -h 确认分区 # 2. du -sh /* 逐层排查 # 3. 常见:日志文件 /var/log/*.log # 4. 清理:find /var/log -name "*.log" -mtime +7 -delete # 场景4:端口被占用 netstat -antp | grep :8080 # 找到 PID → kill PID

面试模拟

面试官:线上 CPU 100%,如何排查?

你:1)top 找到 CPU 最高的 Java 进程 PID;2)top -H -p PID 找到 CPU 最高的线程 ID;3)printf '%x\n' TID 转 16 进制;4)jstack PID | grep -A 30 16进制ID 定位代码;5)分析代码是否有死循环、频繁 GC 等问题。

面试官:如何判断服务器内存是否够用?

你:用 free -h,关键看 available(不是 free)。available 是真正可用的内存(含可回收缓存)。如果 available 很低(< 10% 总内存)、Swap used 持续增长、出现 OOM Killer,说明内存不足。还要看 vmstat 的 si/so 列,如果持续 > 0 说明内存不够在换页。