线上问题排查全流程:从现象到根源的系统分析
线上系统出现故障时,快速定位问题根源是核心目标。本文基于 “分层排查、聚焦瓶颈” 的思路,详细介绍从 CPU、内存、网络、磁盘四个维度排查问题的步骤和工具,帮助高效解决线上故障。
第一步:CPU 使用率过高排查
CPU 是系统运行的核心,其使用率过高会直接导致系统卡顿、响应延迟。
确认 CPU 瓶颈
使用 top 命令实时监控 CPU 状态:
1 | top # 进入界面后按 P 键按 CPU 使用率排序 |
- 关键指标:顶部%Cpu行的%idle(空闲 CPU 百分比)。
- 若
%idle长期 < 10%:表示 CPU 资源紧张。 - 若
%us(用户态 CPU)或%sy(系统态 CPU)长期 > 80%:需定位具体进程。
- 若
定位高 CPU 进程
在
top界面中,%CPU列显示单个进程的 CPU 占用率,记录高占用进程的PID。针对 Java 进程,可进一步分析线程栈:
1
2
3
4
5
6
7
8# 查看进程内线程的 CPU 占用(PID 为目标进程 ID)
top -Hp PID
# 将线程 ID 转换为十六进制(用于 jstack 定位)
printf "%x\n" 线程ID
# 导出进程栈信息,查找对应线程的调用栈
jstack PID | grep 十六进制线程ID -A 30常见原因:死循环、频繁 GC、大量计算任务等,需结合业务代码优化。
第二步:内存不足排查
内存不足会导致系统频繁使用 Swap 分区(磁盘模拟内存),引发性能骤降。
查看内存整体使用
使用 free -h 查看内存状态:
1 | free -h |
- 关键指标:
available(实际可用内存)。若available长期 < 总内存的 10%,且Swap: used持续增长,说明内存不足。
分析内存使用细节
用
top命令按内存排序(按 M 键),定位%MEM高的进程。用vmstat监控内存交换情况:
1
vmstat -n 1 # 每 1 秒输出一次
- 关注
si(从 Swap 读入内存)和so(从内存写入 Swap),若两者长期 > 0,说明内存紧张,系统正在频繁交换数据。
- 关注
常见内存问题
- 内存泄漏:进程内存持续增长且不释放(如未关闭的资源、缓存未过期)。
- 配置不合理:如 JVM 堆内存设置过大,导致系统可用内存不足。
第三步:网络连接异常排查
网络连接数过高或状态异常(如大量 TIME_WAIT)会占用系统资源,导致新连接无法建立。
查看连接总数
1 | # 统计当前 TCP 连接总数 |
- 若连接数远超系统承载能力(如超过
net.ipv4.tcp_max_syn_backlog等内核参数),需优化连接管理。
按进程统计连接数
1 | # 按 PID 统计每个进程的 TCP 连接数 |
- 定位连接数异常的进程(如频繁创建短连接的服务),优化连接复用(如使用长连接、连接池)。
分析连接状态分布
1 | # 统计各 TCP 状态的连接数 |
- 常见异常状态:
TIME_WAIT过多:可能是主动关闭连接的一方未启用tcp_tw_reuse等参数,可通过内核参数优化(如net.ipv4.tcp_tw_recycle = 1)。CLOSE_WAIT过多:表示被动关闭连接的一方未正确释放连接(如应用未调用close()),需修复代码。
第四步:磁盘 IO 瓶颈排查
磁盘读写频繁会导致进程因等待 IO 而阻塞,表现为 iostat 中 %iowait 升高。
监控磁盘 IO 整体情况
1 | iostat -d 1 # 每 1 秒输出一次磁盘 IO 统计 |
- 关注
kB_read/s(每秒读数据量)和kB_wrtn/s(每秒写数据量),若数值持续过高(如超过磁盘理论带宽),说明磁盘繁忙。
定位高 IO 进程
使用iotop实时查看进程的 IO 占用(需安装):
1
iotop # 按 O 键按 IO 使用率排序
若无iotop,可通过进程文件描述符分析:
1
2# 查看进程打开的文件(PID 为目标进程 ID)
ls -l /proc/PID/fd | grep -E '(/dev/sd|/dev/vd)' # 筛选磁盘文件
分析 IO 类型
- 若为随机读写(如数据库索引失效导致的全表扫描):优化索引、使用缓存(如 Redis)。
- 若为大量顺序写(如日志刷盘):调整刷盘策略(如批量写入)、使用 SSD 或 RAID 提升性能