从零排查 Linux 高负载:60 秒快速定位与核心工具实战

举报
yd_241504672 发表于 2026/10/16 02:10:43 2026/10/16
【摘要】 在生产环境中,最常遇到的紧急告警莫过于“CPU 飙高”或“Load Average 异常”。面对突发的高负载,盲目重启服务往往会丢失排查现场。遵循标准化的定位流,可以在 60 秒内迅速锁定问题边界(是 CPU 密集、内存泄漏、磁盘 I/O 瓶颈,还是网络阻塞)。一、指标理解:Load Average 与 CPU 使用率的区别排查问题前,必须分清两个最容易混淆的概念:CPU 使用率(CPU U...
在生产环境中,最常遇到的紧急告警莫过于“CPU 飙高”或“Load Average 异常”。面对突发的高负载,盲目重启服务往往会丢失排查现场。遵循标准化的定位流,可以在 60 秒内迅速锁定问题边界(是 CPU 密集、内存泄漏、磁盘 I/O 瓶颈,还是网络阻塞)。

一、指标理解:Load Average 与 CPU 使用率的区别

排查问题前,必须分清两个最容易混淆的概念:

  • CPU 使用率(CPU Utilization):统计的是 CPU 处于非空闲状态的时间比例(计算密集型任务)。

  • 平均负载(Load Average):统计的是处于 可运行状态(R,Running/Runnable) 和 不可中断睡眠状态(D,Uninterruptible Sleep) 的平均进程数。

核心结论:

  • CPU 使用率高,Load 一定高(大量计算任务排队)。

  • Load 很高,但 CPU 使用率很低:说明大量进程卡在不可中断睡眠状态,通常是磁盘 I/O 阻塞或网络存储响应过慢。

二、黄金 60 秒排查四步法

登录服务器后,按序执行以下命令,快速缩小故障范围。

1. uptime:观察负载趋势

Bash
uptime
# 输出示例:
# 14:20:15 up 45 days,  2:10,  3 users,  load average: 12.45, 8.12, 3.05
  • 对比 1 分钟、5 分钟、15 分钟的数值:

    • 如果 $1\text{ min} > 5\text{ min} > 15\text{ min}$,说明负载正在急剧上升。

    • 如果 $1\text{ min} < 15\text{ min}$,说明峰值已经过去,系统处于恢复期。

  • 基准线:将负载值除以系统逻辑 CPU 核心数(nproc)。超过 1.0 表示核心处于过载排队状态。

2. mpstat -P ALL 1 1:拆解 CPU 核心消耗

确认是否存在多核利用不均,以及具体的 CPU 耗时类型:

指标 含义 异常时的排查方向
%usr 用户态 CPU 应用程序业务逻辑、死循环、算法高开销
%sys 内核态 CPU 高频系统调用、锁争用、上下文切换剧烈
%iowait 等待 I/O 磁盘瓶颈、文件读写高并发、慢查询刷盘
%si 软中断 网卡丢包、网络流量突增、SYN 攻击

3. pidstat -u 1 3:精准抓取开销进程

直接找出消耗 CPU 最多的具体进程 ID(PID):

Bash
pidstat -u 1 3
关注 %CPU 最高的进程。如果发现某个进程占用超过 100%(多线程应用),记下对应的 PID。

4. iostat -xz 1 2:验证磁盘瓶颈

如果 uptime 负载高但 CPU 空闲,重点看磁盘 I/O:

Bash
iostat -xz 1 2
  • %util:磁盘利用率。如果长期超过 80%~90%,说明磁盘已接近饱和。

  • await:I/O 操作的平均等待时间(毫秒)。固态硬盘(NVMe/SSD)通常应小于 5ms;若机械硬盘该值超过几十毫秒,说明排队积压严重。

三、典型场景深度定位方案

场景 A:应用进程 %usr 持续 100%(以 Java/Go 等服务为例)

定位到具体进程后,需要下钻到具体线程与代码堆栈:

  1. 查看进程内部哪个线程占用最高:

    Bash
    top -H -p <PID>
    
    记录占用 CPU 最高的线程 ID(TID)。

  2. 抓取堆栈分析:

    • 若为 Java 应用:将 TID 转换为十六进制(printf "%x\n" <TID>),使用 jstack <PID> | grep -A 20 0x<hex_tid> 查看具体哪行代码在执行。

    • 若为 C/C++/Go 等原生程序:使用 perf 生成性能画像:

      Bash
      perf top -p <PID>
      # 或抓取 30 秒性能数据生成火焰图
      perf record -F 99 -p <PID> -g -- sleep 30
      

场景 B:%sys 过高与上下文切换剧烈

如果 CPU 大量时间耗费在内核空间,通常由于线程频繁竞争锁或高频读写小文件:

Bash
# 查看系统每秒的上下文切换次数(cs)与中断次数(in)
vmstat 1 5
  • 如果 cs(Context Switch)达到数十万级别,进一步使用 pidstat -w 1 查看是哪一个进程引起的主动/被动上下文切换:

    • 非自愿上下文切换(cswch/s)高:任务争抢 CPU 资源严重,线程数远超核心承载力。

    • 自愿上下文切换(nvcswch/s)高:任务在等待 I/O 或锁资源。

场景 C:%iowait 异常高

当系统因不可中断睡眠(D 状态)导致 Load 飙升时:

Bash
# 按 I/O 消耗实时排序进程
iotop -oPa
定位到高 I/O 的 PID 后,使用 lsof 确认该进程正在高频操作哪些具体文件:

Bash
lsof -p <PID>

四、快速排查速查清单

[发现负载异常]
       │
       ├─► 1. uptime / nproc ──────► 确定过载严重程度与变化趋势
       │
       ├─► 2. mpstat -P ALL 1 ─────► 区分瓶颈类型:
       │        ├─ %usr 高  ───────► pidstat -u ──► top -H -p <pid> ──► 分析业务代码
       │        ├─ %sys 高  ───────► vmstat 1 ────► pidstat -w ──────► 排查锁竞争/系统调用
       │        └─ %iowait 高 ─────► iostat -xz ──► iotop ───────────► 定位慢 I/O 文件
       │
       └─► 3. free -h / dmesg ─────► 检查是否触发 OOM Killer 或内核告警
掌握这套以“现象拆解 $\rightarrow$ 瓶颈定性 $\rightarrow$ 线程级下钻”的闭环流程,即可在生产环境故障发生时快速切中要害,避免盲目猜测。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。