负载分析和排查六

明白,我帮你整理成一个完整专业文档,覆盖 CPU 各类负载(%user、%sys、%soft、%si、%iowait)分析、溯源、定位工具与优化策略,并包含脚本示例和中断原理说明。文档结构清晰,便于直接使用或汇报。


Linux CPU 各类负载分析与溯源完整方案


1️⃣ 前提说明

  • 目标:不仅查看表面数据(如 top 中的 %sys/%si/%soft),而且能追溯到具体内核函数、驱动代码、用户态系统调用路径或设备行为,实现“根因可见化”。

  • 可用工具perfftrace/trace-cmdstraceiotopiostatmpstat 等。

  • 分析思路:结合统计分析(计数、采样)调用栈追踪(perf record/report),全方位定位问题。


2️⃣ CPU 各类负载定义

负载类型定义
idle CPU 空闲,没有任务需要处理
user CPU 执行用户态程序代码
system CPU 执行内核态系统代码
nice CPU 执行低优先级(nice)用户进程
iowait CPU 空闲,但等待 I/O 操作完成
irq CPU 处理硬件中断(Hardware Interrupts)
softirq CPU 处理软中断(Software Interrupts)
steal 虚拟化环境中被其他虚拟机占用的时间

注意:%soft%sys 高负载通常只能通过扩容 CPU 或调度部分服务到其他机器来缓解,定位难度较高,需结合 核心计算器、总线与中断统计


3️⃣ 五类负载定位与溯源方案

3.1 软中断 %soft

原因:网络协议栈收包处理(NET_RX)、tasklet、底半部等软中断激增。

定位流程

  1. 查看软中断统计:

watch -n 1 cat /proc/softirqs
  1. 确认 ksoftirqd 占用 CPU:

top -H -p $(pgrep -d, ksoftirqd)
  1. 采样内核调用栈:

sudo perf record -a -g -F 99 -- sleep 10
sudo perf report

重点关注:

  • net_rx_action

  • napi_poll

  • 网卡驱动 *_poll

  • tasklet_action

  1. 关联硬件中断:

cat /proc/interrupts

确认软中断对应硬中断和设备。

  1. 排查原因:

  • 流量异常(大量小包、攻击)

  • 驱动或硬件故障

  • RPS/RFS 配置问题


3.2 硬中断 %si

原因:设备硬中断频繁(网卡、磁盘、USB 等)。

定位流程

  1. 监控中断计数:

watch -n 1 cat /proc/interrupts
  1. 查看中断 CPU 亲和:

cat /proc/irq/<IRQ号>/smp_affinity_list
  1. perf 采样内核中断函数:

sudo perf record -a -g -F 99 -- sleep 10
sudo perf report

关注:

  • irq_handler

  • 驱动中断函数(如 mlx5e_intr, nvme_irq_handler

  1. 检查硬件及驱动日志:

dmesg | tail -50

3.3 iowait %iowait

原因:CPU 等待磁盘 I/O 或内存频繁 swap。

定位流程

  1. 磁盘 I/O 监控:

iostat -xz 1 5
  1. 内存与 swap 监控:

free -m
vmstat 1 5
  1. 实时磁盘 I/O 监控:

iotop -ao
  1. perf 跟踪阻塞 syscall:

sudo perf record -e syscalls:sys_enter_read,syscalls:sys_enter_write -a -g -- sleep 10
sudo perf report
  1. ftrace 跟踪块设备请求延迟:

sudo trace-cmd record -e block_rq_issue -e block_rq_complete -- sleep 10
sudo trace-cmd report
  1. 内存压力分析:

  • top -H 查看 kswapd CPU 占用

  • 频繁 swap → 内存压力导致 iowait


3.4 %sys(系统态负载)

原因:大量系统调用或内核态执行。

定位流程

  1. 找高 CPU 进程:

ps -eo pid,comm,%cpu --sort=-%cpu | head
  1. strace 统计 syscall:

strace -c -p <pid> -t 10
  1. perf 采样内核调用栈:

sudo perf top -g
sudo perf record -a -g -- sleep 10
sudo perf report

关注热点函数,如 do_sys_open, vfs_read, ip_rcv


3.5 %user(用户态负载)

原因:用户态程序计算密集、算法瓶颈、死循环。

定位流程

  1. 查最耗 CPU 的线程:

top -H
  1. perf 采样用户态调用栈:

sudo perf record -p <pid> -g -- sleep 10
sudo perf report

4️⃣ 统计与诊断工具对照表

负载类型定位重点工具溯源关键点
%soft 软中断类型及执行代码 /proc/softirqs, top -H ksoftirqd, perf record/report 网卡驱动软中断处理路径
%si 触发硬中断设备 /proc/interrupts, perf record/report 设备中断号及驱动 ISR
%iowait 磁盘性能或内存 swap iostat, vmstat, iotop, trace-cmd, perf 阻塞 syscall 或磁盘请求延迟
%sys 频繁 syscall / 内核热点 strace, perf top/report 内核函数路径
%user 用户态 CPU 消耗 top -H, perf record/report 用户态热点函数

5️⃣ 示例脚本

5.1 软中断统计(动态分析)

#!/bin/bash
awk '
BEGIN { print "中断类型     总计     占比"; print "=========================" }
NR>1 {
    type=$1; gsub(/:/,"",type);
    sum=0; for(i=2;i<=NF;i++) sum+=$i;
    counts[type]=sum; total+=sum
}
END {
    for(t in counts) printf "%-12s %10d %8.2f%%\n", t, counts[t], counts[t]*100/total
}'
/proc/softirqs

5.2 硬件中断统计

#!/bin/bash
awk '
BEGIN{print "控制器 类型 计数 占比"; total=0}
NR>1 && $1 ~ /^[0-9]+:/ {
    irq=$1; gsub(/:/,"",irq)
    sum=0; for(i=2;i<=NF;i++) sum+=$i
    total+=sum; counts[irq]=sum
}
END{
    for(i in counts) printf "%5s %8d %6.2f%%\n", i, counts[i], counts[i]*100/total
}'
/proc/interrupts

6️⃣ Linux 中硬件中断与软中断原理

项目硬中断(HardIRQ)软中断(SoftIRQ)
触发方式 硬件设备(网卡、磁盘等) 内核调度或硬中断触发
执行时机 立即响应(上半部) 延迟处理(下半部)
执行位置 ISR(Interrupt Service Routine) do_softirq()ksoftirqd/N
是否可睡眠
**典型例子    

** | eth0 收包 | NET_RX, TASKLET |

小结:硬中断快、短,软中断可合并处理网络/定时任务。高 %soft + %si 往往说明网络流量或磁盘 IO 压力大。


7️⃣ 性能优化思路

  1. 软中断过高

    • 网卡 RSS/RFS 配置

    • 增加 CPU 核心绑定中断

    • 优化内核网络栈

  2. 硬中断过高

    • 优化驱动或硬件中断 coalescing

    • 调整 IRQ CPU 亲和

  3. iowait 高

    • 磁盘优化(RAID/SSD)

    • 内存扩容,减少 swap

    • 调整 IO 调度器 (mq-deadline, bfq)

  4. system 高

    • 减少高频 syscall

    • 优化内核模块

    • 调整应用程序系统调用方式(批量化)

  5. user 高

    • 优化应用算法

    • 使用多线程/异步 IO

    • 分布式拆分计算


8️⃣ 总结

  • CPU 高负载不是单一 %cpu 表面指标,而是多维度指标交织:%user/%sys/%soft/%si/%iowait

  • 通过 proc 文件系统 + perf/ftrace + sysstat 工具链 可以精准定位根因。

  • 针对不同负载类型采取不同优化措施,结合 软/硬中断调度、内核/驱动优化、IO 资源调优、应用程序算法优化 可显著改善系统性能。


 

posted on 2025-09-22 18:06  吃草的青蛙  阅读(31)  评论(0)    收藏  举报

导航