负载分析和排查六
明白,我帮你整理成一个完整专业文档,覆盖 CPU 各类负载(%user、%sys、%soft、%si、%iowait)分析、溯源、定位工具与优化策略,并包含脚本示例和中断原理说明。文档结构清晰,便于直接使用或汇报。
Linux CPU 各类负载分析与溯源完整方案
1️⃣ 前提说明
-
目标:不仅查看表面数据(如
top
中的%sys/%si/%soft
),而且能追溯到具体内核函数、驱动代码、用户态系统调用路径或设备行为,实现“根因可见化”。 -
可用工具:
perf
、ftrace/trace-cmd
、strace
、iotop
、iostat
、mpstat
等。 -
分析思路:结合统计分析(计数、采样)和调用栈追踪(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、底半部等软中断激增。
定位流程:
-
查看软中断统计:
watch -n 1 cat /proc/softirqs
-
确认 ksoftirqd 占用 CPU:
top -H -p $(pgrep -d, ksoftirqd)
-
采样内核调用栈:
sudo perf record -a -g -F 99 -- sleep 10
sudo perf report
重点关注:
-
net_rx_action
-
napi_poll
-
网卡驱动
*_poll
-
tasklet_action
-
关联硬件中断:
cat /proc/interrupts
确认软中断对应硬中断和设备。
-
排查原因:
-
流量异常(大量小包、攻击)
-
驱动或硬件故障
-
RPS/RFS 配置问题
3.2 硬中断 %si
原因:设备硬中断频繁(网卡、磁盘、USB 等)。
定位流程:
-
监控中断计数:
watch -n 1 cat /proc/interrupts
-
查看中断 CPU 亲和:
cat /proc/irq/<IRQ号>/smp_affinity_list
-
perf 采样内核中断函数:
sudo perf record -a -g -F 99 -- sleep 10
sudo perf report
关注:
-
irq_handler
-
驱动中断函数(如
mlx5e_intr
,nvme_irq_handler
)
-
检查硬件及驱动日志:
dmesg | tail -50
3.3 iowait %iowait
原因:CPU 等待磁盘 I/O 或内存频繁 swap。
定位流程:
-
磁盘 I/O 监控:
iostat -xz 1 5
-
内存与 swap 监控:
free -m
vmstat 1 5
-
实时磁盘 I/O 监控:
iotop -ao
-
perf 跟踪阻塞 syscall:
sudo perf record -e syscalls:sys_enter_read,syscalls:sys_enter_write -a -g -- sleep 10
sudo perf report
-
ftrace 跟踪块设备请求延迟:
sudo trace-cmd record -e block_rq_issue -e block_rq_complete -- sleep 10
sudo trace-cmd report
-
内存压力分析:
-
top -H
查看kswapd
CPU 占用 -
频繁 swap → 内存压力导致 iowait
3.4 %sys
(系统态负载)
原因:大量系统调用或内核态执行。
定位流程:
-
找高 CPU 进程:
ps -eo pid,comm,%cpu --sort=-%cpu | head
-
strace 统计 syscall:
strace -c -p <pid> -t 10
-
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
(用户态负载)
原因:用户态程序计算密集、算法瓶颈、死循环。
定位流程:
-
查最耗 CPU 的线程:
top -H
-
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+=$itotal+=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️⃣ 性能优化思路
-
软中断过高:
-
网卡 RSS/RFS 配置
-
增加 CPU 核心绑定中断
-
优化内核网络栈
-
-
硬中断过高:
-
优化驱动或硬件中断 coalescing
-
调整 IRQ CPU 亲和
-
-
iowait 高:
-
磁盘优化(RAID/SSD)
-
内存扩容,减少 swap
-
调整 IO 调度器 (
mq-deadline
,bfq
)
-
-
system 高:
-
减少高频 syscall
-
优化内核模块
-
调整应用程序系统调用方式(批量化)
-
-
user 高:
-
优化应用算法
-
使用多线程/异步 IO
-
分布式拆分计算
-
8️⃣ 总结
-
CPU 高负载不是单一
%cpu
表面指标,而是多维度指标交织:%user/%sys/%soft/%si/%iowait
。 -
通过 proc 文件系统 + perf/ftrace + sysstat 工具链 可以精准定位根因。
-
针对不同负载类型采取不同优化措施,结合 软/硬中断调度、内核/驱动优化、IO 资源调优、应用程序算法优化 可显著改善系统性能。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/909918.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!