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 模块)

  1. top 找 CPU 最高的进程 PID
  2. top -Hp PID 找进程内最高的线程 TID
  3. printf "%x\n" TID 转十六进制 nid
  4. jstack PID | grep -A 30 "0xnid" 定位代码行
  5. 判断:死循环/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 切片)

🎤 常见面试追问

  1. CPU 飙高排查流程(背命令链)?——top 找进程 → top -Hp 找线程 → printf "%x" 转 nid → jstack | grep "0xnid" 定位代码。Java 场景 Arthas 更快(dashboard/thread -n 3)。
  2. load average 怎么解读?——1/5/15 分钟平均负载(排队任务数):持续大于核数 = 过载。如 4 核 load 8 = 满负荷 2 倍。
  3. free -h 的 available 和 free 区别?——free 是"完全没用的";available 是"可分配的"(含可回收的 buff/cache)——看 available 才是真实可用内存。
  4. Java 进程 RSS 比 -Xmx 大正常吗?——正常:RSS = 堆 + 元空间 + 线程栈 + 直接内存 + JIT 等。排查内存先 jmap 看堆,再看非堆。
  5. 日志分析万能管道?——grep 过滤 → awk 取列 → sort | uniq -c 计数 → sort -rn 降序 → head 取 Top——接口报错 TopN、IP 统计都靠它。

📖 名词解释(本页术语)

术语 大白话解释
top实时资源监控:CPU 占用、内存、负载、进程列表——排障第一站。
load average系统负载(运行+等待的任务数),1/5/15 分钟三个值,超核数 = 过载。
free -h内存查看:看 available(可分配)不看 free;swap 使用率高 = 内存真不够。
df -h / df -i磁盘块使用 / inode 使用——"磁盘满"要先分清哪个。
jstack / jmap / jstatJVM 三件套:线程栈(卡死/死锁)、堆(泄漏)、GC 统计(调优)。
grep / sed / awk文本三剑客:过滤、流编辑、列处理——日志分析的标配。
Arthas阿里在线诊断工具:不用重启查线程/方法耗时/反编译,生产排障神器。
RSS / 常驻内存进程实际占用的物理内存(ps aux 里看到)。Java 进程 RSS 包括堆+非堆。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。