🐧 Linux 实战
常用命令 · CPU/内存/IO 排障流程 · 文本处理三剑客
1. 必须掌握的 Linux 命令清单?
按场景速查
# 系统/进程
top / htop # 资源总览(CPU/内存/负载)
ps -ef | grep java # 找进程
uptime # 负载(1/5/15 分钟)
free -h # 内存(注意 available 不是 free)
df -h / df -i # 磁盘块 / inode
ulimit -n # 文件描述符上限
# 网络
netstat -antp / ss -antp # 端口与连接状态
lsof -i:8080 # 谁占了端口
telnet host port # 测连通性
curl -v http://x # 调试 HTTP(-I 只看头)
# 文件/日志
tail -f app.log # 跟日志
grep -n "ERROR" app.log # 过滤
find / -name "*.jar" # 找文件
scp / rsync # 传文件
🎯 面试要点
- 面试必会:top 看 load、free 看内存、df 看磁盘、netstat 看端口、tail/grep 看日志
- load average 与 CPU 核数对比判断过载:load > 核数 = 排队
2. 线上 CPU 飙高排查流程?(结合 JVM 模块)
top找 CPU 最高的进程 PIDtop -Hp PID找进程内最高的线程 TIDprintf "%x\n" TID转十六进制 nidjstack PID | grep -A 30 "0xnid"定位代码行- 判断:死循环/GC 线程/锁自旋/正则回溯?
非 Java 进程:perf top 看热点函数;系统级:vmstat 1 看 us/sy 占比(sy 高 = 系统调用/上下文切换多)。
🎯 面试要点
- 区分 us(用户态)与 sy(内核态):sy 高 → 系统调用频繁/线程切换多
- Arthas dashboard / thread -n 3 是 Java 场景的最快路径
3. 内存和磁盘 IO 怎么排查?
内存 & IO 排查
# 内存
free -h # used 大不等于泄漏:buff/cache 可回收
# Java 进程真实内存:
ps aux | grep java # RSS(常驻内存)= 堆 + 元空间 + 线程栈 + 直接内存
jmap -heap PID # 堆内分布
# swap 使用率高 → 内存真的不够(swap 慢 10 倍以上)
# 磁盘 IO
iostat -x 1 # %util(磁盘繁忙度)、await(平均等待)、r/s w/s
iotop # 谁在读写
# %util ~100% + await 大 → 磁盘瓶颈(换 SSD/加机器/减 IO)
🎯 面试要点
- Java 进程内存 = 堆 + 非堆(元空间/栈/直接内存)——"RSS 比 -Xmx 大"是正常的,别误判泄漏
- IO 饱和的症状:数据库慢查询变多、日志写入慢、GC 变长(刷盘慢)
4. grep / sed / awk 三剑客?
高频用法
# grep:过滤
grep -E "ERROR|Exception" app.log | wc -l # 错误数统计
grep -A 5 "NullPointer" app.log # 上下文 5 行
# sed:流编辑
sed -n '100,200p' app.log # 看指定行区间
sed -i 's/old/new/g' config.yml # 全局替换(改文件)
# awk:列处理
awk '{print $1, $7}' app.log | sort | uniq -c | sort -rn | head
# 按第一列统计频次排序——日志分析万能管道
awk '{sum+=$9} END {print sum/NR}' app.log # 某列平均值
🎯 面试要点
- 日志分析套路:grep 过滤 → awk 取列 → sort | uniq -c 计数 → sort -rn 排序 → head 取 Top
- 大日志文件:先 grep 缩小范围,别直接 cat 整个文件(用 tail/head 切片)