一句话总结
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 说明内存不够在换页。