首页/系统/Linux 内核与性能调优速查/软中断与 ksoftirqd 排查
CPU 与调度60 条

软中断与 ksoftirqd 排查

网络与块设备的收尾工作在软中断中完成;压力高时 ksoftirqd 线程接手处理,单核 si 高往往对应中断集中或包处理风暴。

软中断与 ksoftirqd

网络与块设备的收尾工作在软中断中完成。压力不大时,软中断在中断返回路径上就地处理;压力大时交给每核一个的 ksoftirqd 内核线程接手。因此某核 si 偏高或 ksoftirqd 占用上升,通常意味着该核承担了过多软中断工作,常见原因是中断集中在少数核、包处理量过大或单核收包。软中断类型分布可从 /proc/softirqs 查看,其中 NET_RX 与 BLOCK 最常被关注。

基本信息

累计计数/proc/softirqs,按类型与 CPU 分列
内核线程ksoftirqd/N,每个 CPU 一个
视图mpstat 的 %soft、top 的 si
相关参数netdev_budget 系列、RPS 设置
判读方式两次采样比较增量

典型使用场景

  • 单核 si 偏高而其他核空闲
  • 网络收包能力受限
  • 存储中断处理占用偏高
  • 排查 ksoftirqd 线程 CPU 占用上升
  • 收包优化(RPS、中断亲和)前后验证效果

查看增量与线程

查看增量与线程
cat /proc/softirqs                   # 各类软中断的每核累计计数
sleep 5; cat /proc/softirqs          # 再采样一次比较增量
ps -eo pid,psr,pcpu,comm | grep ksoftirq
mpstat -P ALL 1 3                    # 看 %soft 的核间分布
top -b -n1 | head -20
cat /proc/interrupts | head -10      # 硬件中断分布对照

数据源读法

数据源含义判读
/proc/softirqs按类型与 CPU 的累计处理次数累计值,必须看增量
mpstat 的 %soft软中断占用比例单核显著高于其他核即为热点
top 的 si整体软中断占用粒度比 %soft 粗
ksoftirqd/N每核对应的处理线程占用上升说明该核压力大
/proc/softirqs 是累计值,判断当前压力必须比较两次采样的差值,单次读数看不出问题。
软中断热点应优先从网络中断亲和与 RPS 入手,把处理分散开,而不是调高内核线程的优先级。

分散软中断压力的手段

  • 中断亲和:把网卡各队列的中断分散到不同的核
  • RPS 与 RFS:在软件层把收包处理分发到更多核
  • 提高软中断预算前先确认 dropped 与 time_squeeze 确实在增长
  • 核对网卡队列数与核数是否匹配,避免大量队列挤在少数核上
判断 si 是否异常需要基线:同样的占用比例在 4 核与 64 核机器上含义完全不同,应结合核数与业务吞吐一起看。

易错点

  • 直接读累计值:忽略采样间隔,无法判断当前压力
  • 只看总量不看逐核:定位不到热点核
  • 用提高 ksoftirqd 优先级解决:真正的问题是处理集中在单核
  • 混淆硬件中断与软中断:/proc/interrupts 与 /proc/softirqs 是两层
  • 忽略存储软中断:BLOCK 类升高同样会抢占 CPU 资源

数据来源与参考

  • Linux 内核 Documentation/core-api/softirq.rst
  • procps/sysstat 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌