0%

线上问题排查

线上问题排查全流程:从现象到根源的系统分析

线上系统出现故障时,快速定位问题根源是核心目标。本文基于 “分层排查、聚焦瓶颈” 的思路,详细介绍从 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
2
3
4
5
free -h
# 输出示例:
# total used free shared buff/cache available
# Mem: 31G 25G 2.1G 1.2G 3.9G 4.5G
# Swap: 15G 8.2G 6.8G
  • 关键指标available(实际可用内存)。若 available 长期 < 总内存的 10%,且 Swap: used 持续增长,说明内存不足。

分析内存使用细节

  • top 命令按内存排序(按 M 键),定位 %MEM 高的进程。

  • 用vmstat监控内存交换情况:

    1
    vmstat -n 1  # 每 1 秒输出一次
    • 关注 si(从 Swap 读入内存)和 so(从内存写入 Swap),若两者长期 > 0,说明内存紧张,系统正在频繁交换数据。

常见内存问题

  • 内存泄漏:进程内存持续增长且不释放(如未关闭的资源、缓存未过期)。
  • 配置不合理:如 JVM 堆内存设置过大,导致系统可用内存不足。

第三步:网络连接异常排查

网络连接数过高或状态异常(如大量 TIME_WAIT)会占用系统资源,导致新连接无法建立。

查看连接总数

1
2
# 统计当前 TCP 连接总数
netstat -tnop | wc -l
  • 若连接数远超系统承载能力(如超过 net.ipv4.tcp_max_syn_backlog 等内核参数),需优化连接管理。

按进程统计连接数

1
2
# 按 PID 统计每个进程的 TCP 连接数
netstat -tnp | awk '{print $7}' | sort | uniq -c | sort -nr
  • 定位连接数异常的进程(如频繁创建短连接的服务),优化连接复用(如使用长连接、连接池)。

分析连接状态分布

1
2
# 统计各 TCP 状态的连接数
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c
  • 常见异常状态:
    • 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 提升性能

欢迎关注我的其它发布渠道