4.10.2 系统与应用层故障定位工具

在系统与应用层故障定位中,优先建立“现象—指标—证据”链路:先定位异常范围(系统/应用/网络/存储),再锁定瓶颈资源(CPU/内存/IO/线程/锁),最后收集可复现的证据(日志、栈、指标、抓包)。常用工具分为系统级与应用级两类,结合场景选择,避免全量开启造成干扰。

文章图片

系统层定位工具与要点
- top/htop:观察负载、CPU占用、线程数、内存与Swap;重点看负载与CPU使用率是否匹配、是否有单进程异常飙升。
- ps/pidstat:定位具体进程及线程资源消耗;pidstat -p/-t可细化到线程层级。
- vmstat:快速判断CPU、内存、IO是否整体异常;关注r/b、wa、si/so。
- iostat:磁盘IO性能分析;关注await、svctm、util是否持续高。
- sar:历史趋势回看;结合sar -u/-r/-d/-n定位异常开始时间与资源趋势。
- lsof:定位文件句柄泄露、端口占用与网络连接。
- ss/netstat:连接数、状态、端口占用排查;关注大量TIME_WAIT/CLOSE_WAIT。
- dmesg/journalctl:内核与系统服务日志;排查OOM、磁盘错误、驱动异常。
- strace:系统调用级定位;用于判断进程卡顿是否在IO、锁、网络等待。
- perf:CPU热点函数定位;用于高CPU但无明显日志的场景。
- tcpdump:网络层抓包定位;验证重传、丢包、连接建立是否异常。

应用层定位工具与要点
- 日志体系:业务日志、异常日志、访问日志三类必备;通过TraceID串联上下游请求。
- 应用自检接口:健康检查、依赖可用性、版本信息与构建号,用于快速确认服务状态。
- JVM工具(Java):jstack/jmap/jstat/jcmd定位线程死锁、GC异常、内存泄露;结合线程栈与CPU热点线程号。
- 数据库工具:慢查询日志、show processlist、锁等待视图;锁与慢查询常见导致应用卡顿。
- 中间件监控:连接池、队列堆积、重试次数与超时统计;从“请求入口到依赖调用”分析阻塞点。
- APM/Tracing:链路追踪(如OpenTelemetry)快速定位耗时节点与异常比例。

安装与基础准备

# RHEL/CentOS
yum install -y sysstat perf tcpdump lsof strace

# Debian/Ubuntu
apt-get update
apt-get install -y sysstat linux-tools-common linux-tools-$(uname -r) tcpdump lsof strace

# 启用 sysstat 历史采集(sar)
systemctl enable --now sysstat

系统层示例:高CPU定位(含命令解释与预期)

# 1) 找到高CPU进程
top -o %CPU
# 预期:看到某进程PID占用异常

# 2) 按线程查看该进程(-t线程,-p指定PID)
pidstat -p 1234 -t 1
# 预期:定位到高CPU线程TID

# 3) perf 采样,定位热点函数
perf top -p 1234
# 预期:输出热点函数栈,确认是否为忙循环或锁竞争

# 4) 若怀疑系统调用阻塞,补充 strace
strace -p 1234 -tt -T -f -o /tmp/strace.1234.log
# 预期:日志显示卡在 read/write/futex/connect 等调用

系统层示例:IO瓶颈定位

# 1) 磁盘整体指标
iostat -x 1 5
# 关注字段:await, svctm, %util

# 2) 定位高IO进程
pidstat -d 1
# 预期:某进程的 r/s w/s 大

# 3) 打开文件定位热点文件
lsof -p 5678 | head
# 预期:出现某大文件或日志写入过多

# 4) 持续回看历史趋势
sar -d -f /var/log/sa/sa$(date +%d)

网络问题示例:超时与重传

# 1) 连接状态
ss -s
ss -tan state time-wait | head

# 2) 抓包验证重传(以eth0和目标端口8080为例)
tcpdump -i eth0 port 8080 -w /tmp/8080.pcap

# 3) 快速查看抓包摘要
tcpdump -nn -r /tmp/8080.pcap | head
# 预期:出现 [TCP Retransmission] 或重复ACK

应用层示例:JVM线程死锁/高CPU

# 1) 获取进程PID
jps -l

# 2) 采集线程栈
jstack 1234 > /tmp/jstack.1234.log

# 3) 根据top找到高CPU线程TID(十进制转十六进制)
printf "0x%x\n" 23456
# 预期:得到线程nid,与jstack中nid匹配

# 4) 可视化GC状态
jstat -gc 1234 1s 5

应用层示例:数据库锁与慢查询

# MySQL查看慢查询与锁
mysql -uroot -p -e "show processlist\G"
mysql -uroot -p -e "show engine innodb status\G"
# 预期:看到长时间Running的SQL或锁等待

常见故障场景与工具组合
- 高CPU:top + pidstat + perf/strace;确认忙循环、锁竞争或热点函数。
- 内存飙升/频繁GC:free + vmstat + jstat/jmap;定位泄露对象与缓存策略。
- IO性能瓶颈:iostat + sar -d + lsof;识别热点磁盘与异常进程。
- 网络超时/抖动:ss + tcpdump + 应用日志;确认重传、丢包与连接耗尽。
- 应用无响应:jstack/strace + 日志 + 依赖服务状态;排除死锁、依赖超时或线程池耗尽。

排错清单(现场执行顺序建议)
1. 轻量指标:uptime/top/vmstat/iostat/ss
2. 明确进程:ps/pidstat/lsof
3. 深入证据:strace/perf/jstack/tcpdump
4. 证据归档:日志/栈/抓包/指标对齐时间线

练习(可复现实验)
1. CPU忙循环:运行 bash -c 'while :; do :; done',用 top/pidstat/perf 找出热点。
2. IO瓶颈dd if=/dev/zero of=/tmp/bigfile bs=1M count=2048 oflag=direct,用 iostat/pidstat 定位。
3. 网络重传:在低带宽环境或用 tc 限速后抓包,观察 tcpdump 重传。
4. JVM高CPU:运行一个高CPU Java线程,使用 jstack+线程nid定位热点。

实战建议
- 现场先轻量工具再重型工具,避免干扰系统。
- 保留时间线:指标、日志与变更记录对齐。
- 形成标准化采集清单:CPU、内存、IO、网络、进程、日志、堆栈、抓包。