文章目录
- 研发排查Linux各类问题命令+实战案例
-
- [1、CPU 占用过高](#1、CPU 占用过高)
- 2、内存问题(内存飙升、OOM、Swap抖动)
- 3、磁盘空间占满
- [4、磁盘IO过高(IO瓶颈,CPU iowait高)](#4、磁盘IO过高(IO瓶颈,CPU iowait高))
- 5、网络类问题
-
- [5.1 端口占用、端口监听检查](#5.1 端口占用、端口监听检查)
- [5.2 连通性、接口调用排查](#5.2 连通性、接口调用排查)
- [5.3 简单抓包](#5.3 简单抓包)
- [6、文件句柄耗尽 `Too many open files`](#6、文件句柄耗尽
Too many open files) - [7、进程异常(进程挂掉、被OOM killer杀死)](#7、进程异常(进程挂掉、被OOM killer杀死))
- 8、日志排查(大日志搜索)
- [9、JVM Java应用整套排查速查](#9、JVM Java应用整套排查速查)
- 故障排查流程速记(面试背诵版)
研发排查Linux各类问题命令+实战案例
面向后端开发,线上故障排查,每个问题包含:现象 → 命令组合 → 实操案例,面试可直接口述。
1、CPU 占用过高
现象:接口响应慢、负载高、服务卡顿
# 1.查看整体负载、CPU,找到高占用PID
top -c
# 2.查看进程内部线程占用(Java重点)
top -H -p <pid>
# 3.线程ID转16进制
printf "%x\n <tid>"
# 4.导出线程堆栈,定位死循环/死锁
jstack <pid> > thread.log
# 搜索16进制tid,找到业务代码堆栈
# 快速看系统整体CPU/上下文切换
vmstat 2
vmstat 重点:
cs上下文切换暴涨,说明线程竞争激烈。
2、内存问题(内存飙升、OOM、Swap抖动)
现象:服务OOM被杀、系统卡顿、swap频繁读写
# 查看内存,重点看available
free -h
# 看swap换入换出,si/so持续>0 内存不足
vmstat 2
# 按内存排序看进程
ps -aux --sort=-%mem | head -10
# Java服务
jmap -heap <pid> # 查看堆配置和使用
jmap -dump:format=b,file=heap.hprof <pid> # dump堆文件,本地MAT分析内存泄漏
注意:jmap dump会STW,生产避开高峰;si、so持续不为0,优先扩容内存或调小JVM堆。
3、磁盘空间占满
现象:无法写日志、报错No space left on device
# 查看磁盘分区使用率
df -h
# 定位哪个目录占用大
du -sh /*
du -sh /opt/logs/*
# 快速查找大文件
find /data -type f -size +1G
# 坑:rm删除文件,进程还持有句柄,df空间不释放
# lsof 查看已删除但未释放的文件
lsof | grep deleted
解决方案:不要直接rm正在输出的日志,用
> app.log清空,或者重启对应进程释放空间。
4、磁盘IO过高(IO瓶颈,CPU iowait高)
现象:top中%wa很高,业务线程大量IO等待,接口超时
# 看磁盘IO统计,%util接近100%说明磁盘打满
iostat -x 2
# 定位哪些进程在大量读写磁盘
iotop -oP
重点指标:
%util:磁盘繁忙占比await:IO平均等待时间,数值大说明IO压力大
5、网络类问题
5.1 端口占用、端口监听检查
# 查看端口监听,优先ss,性能优于netstat
ss -tulnp | grep 8080
# 统计TCP连接各状态数量
ss -an | awk '{print $2}' | sort | uniq -c
常见异常:
- 大量
TIME_WAIT:短连接频繁创建 - 大量
CLOSE_WAIT:程序代码未关闭socket,连接泄漏
5.2 连通性、接口调用排查
# 端口连通测试
telnet ip port
# 或者
nc -zv ip port
# curl看完整请求链路、耗时、响应码
curl -v http://xxx/api/test
# 路由跟踪,排查链路丢包
traceroute xxx.com
5.3 简单抓包
# 抓取eth0网卡8080端口流量,保存文件,本地wireshark分析
tcpdump -i eth0 port 8080 -w traffic.pcap
6、文件句柄耗尽 Too many open files
现象:报错打开文件过多,无法建立连接、无法打日志
# 查看进程打开多少文件句柄
lsof -p <pid> | wc -l
# 查看系统单进程最大句柄限制
ulimit -n
# 查看进程全部打开的文件、socket
lsof -p <pid>
根因:文件流未关闭、数据库/redis连接池泄露、socket未释放。
7、进程异常(进程挂掉、被OOM killer杀死)
现象:Java进程莫名消失,无业务报错日志
# 查看系统日志,确认是否被OOM Killer杀掉
dmesg -T | grep -i oom
# 查看进程是否存在
ps -ef | grep java
# 查看进程资源限制
cat /proc/<pid>/limits
dmesg可以看到内核日志:OOM killer会打印哪个pid被杀死。
8、日志排查(大日志搜索)
# 实时跟踪日志
tail -f app.log
# 实时过滤error
tail -f app.log | grep -i error
# 搜索关键词,同时打印前后5行上下文
grep -C 5 "Exception" app.log
# 大日志只读取末尾1000行再搜索
tail -n 10000 app.log | grep NullPointerException
# less浏览大日志
less app.log
# less快捷键:G跳到末尾,/向下搜索,?向上搜索
9、JVM Java应用整套排查速查
jps -l # 列出所有Java进程
jstack <pid> > jstack.log # 线程堆栈,死锁、死循环
jmap -heap <pid> # 堆概况
jmap -dump:format=b,file=heap.hprof <pid> # 堆dump,内存泄漏
jstat -gc <pid> 1000 # 每秒打印GC情况,看YGC/FGC次数耗时
jstat -gc观察:FGC频繁、FGC时间很长 → 内存泄漏或堆配置不合理。
故障排查流程速记(面试背诵版)
- CPU高 :
top→top -H -p pid→jstack - 内存/OOM :
free -h→vmstat→jstat‑gc→jmap dump - 磁盘满 :
df -h→du -sh→lsof |grep deleted - IO慢(iowait高) :
iostat -x 2→iotop - 网络异常 :
ss -an→curl -v/nc→tcpdump - 句柄泄露 :
lsof -p pid→ulimit -n - 进程莫名消失 :
dmesg -T | grep oom