专项攻克——研发排查Linux各类问题命令+实战案例

文章目录

研发排查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时间很长 → 内存泄漏或堆配置不合理。

故障排查流程速记(面试背诵版)

  1. CPU高 :top → top -H -p pid → jstack
  2. 内存/OOM :free -h → vmstat → jstat‑gc → jmap dump
  3. 磁盘满 :df -h → du -sh → lsof |grep deleted
  4. IO慢(iowait高) :iostat -x 2 → iotop
  5. 网络异常 :ss -an → curl -v/nc → tcpdump
  6. 句柄泄露 :lsof -p pid → ulimit -n
  7. 进程莫名消失 :dmesg -T | grep oom
相关推荐
GeW27 分钟前
如何打造真正的数字化工厂?需从Red Hat到数据库底层打捞基石
linux
沫璃染墨33 分钟前
从零入门计算机网络系列(一):计算机网络初识——从网络发展史到TCP/IP协议》
linux·网络·网络协议·tcp/ip·计算机网络
云贝贝贝35 分钟前
PostgreSQL 分区表:从设计到运维,大表不再卡
运维·数据库·postgresql
zyseo842 分钟前
谷歌SEO 站内搜索优化实战:把站内搜索词变成关键词金矿
java·服务器·数据库
王大傻09281 小时前
堆叠注入(Stacked Queries Injection)详解:原理、利用与防御
服务器·网络·数据库·web安全·网络安全
bigcarp1 小时前
安卓模拟器MUMU+tcpdump抓包Socket协议流量
服务器·网络·tcpdump
是个西兰花1 小时前
TCP套接字编程实战:从服务器搭建到多进程处理
服务器·网络协议·tcp/ip
zhangzeyuaaa1 小时前
Ruby `require` 完全指南:从 `$LOAD_PATH` 到 `require_relative`
服务器·前端·ruby
fengkai45452 小时前
十二、Redis -1
运维·数据库·redis
忆挽篱笙歌2 小时前
gdb/cgdb
linux·ubuntu