Linux怎么查看系统的Interrupts中断 Linux中断平衡优化详解

Linux怎么查看系统的Interrupts中断 Linux中断平衡优化详解

系统教程

直接查看/proc/interrupts可获中断分布,但需结合设备类型、CPU亲和性、软中断及irqbalance状态综合判断是否失衡;关键在识别单CPU上异常飙升的特定IRQ(如eth0、nvme),并验证其软中断(/proc/softirqs)与业务线程是否同步均衡。

直接看 /proc/interrupts 就能知道系统中断分布,但光看数字没用——得结合设备、CPU亲和性、软中断和 irqbalance 状态一起判断是否真存在失衡。

怎么快速定位高干扰中断源

中断失衡往往不是“所有中断都多”,而是某几个 IRQ 在单个 CPU 上疯狂增长,把那个核拖垮。关键不是总量,是分布斜率。

  • cat /proc/interrupts 输出里找最后一列含 eth0nvmemsiIO-APIC 的行,再盯紧某一个 CPU 列(比如 CPU1)数值是否远高于其他列
  • watch -n 1 'cat /proc/interrupts | grep "eth0\|nvme"' 实时观察——如果某行某列每秒涨几百甚至上千,基本就是它在捣鬼
  • 注意 RES(重调度)、CAL(IPI)、TIMER 这类内核中断持续飙升,通常说明进程调度异常或有 busy-loop,不是硬件问题
  • ethtool -S eth0 | grep -E "(rx_packets|rx_interrupts)":若 rx_interrupts 远大于 rx_packets(比如 5:1),说明 NAPI 没生效,网卡在“包包中断”,得查 GRO/LRO 和 RSS 队列数

为什么改了 smp_affinity 还没用

手动写 /proc/irq/42/smp_affinity 后过几秒又变回去?八成是 irqbalance 在后台偷偷覆盖你。

文小言创作者平台

Prompt创作创建、调试、发布的一站式创作平台

下载

  • systemctl status irqbalance 必须先确认服务状态;只要你在做低延迟或绑核优化,sudo systemctl stop irqbalance && sudo systemctl disable irqbalance 是强制动作
  • smp_affinity 是十六进制掩码,0x01 = CPU0,0x03 = CPU0+CPU1,但现代系统更推荐用 smp_affinity_list(如 echo 0,2 > /proc/irq/42/smp_affinity_list),可读性高且避免位运算错误
  • 写入前确认该 IRQ 是否支持动态调整:ls -l /proc/irq/42/ 中要有 smp_affinity* 文件;某些固件锁定的中断(如某些 BMC 或老 RAID 卡)写入会报 Operation not permitted
  • NUMA 架构下,优先把网卡 IRQ 绑到与该网卡直连的 CPU 节点(用 lscpulspci -vv -s $(ethtool -i eth0 | grep bus-info | awk '{print $2}') | grep NUMA 交叉验证)

软中断(softirq)堆积比硬件中断更隐蔽

/proc/interrupts 只统计硬件 IRQ 触发次数,而 NET_RXNET_TXRCU 这些软中断在 /proc/softirqs 里,它们不占 IRQ 编号,但吃 CPU 更狠,且容易被误认为是“进程占用”。

  • cat /proc/softirqs 查看各 CPU 上 softirq 执行次数,重点关注 NET_RX 列——如果 CPU1 的值是其他核的 5 倍以上,且 mpstat -P ALL 1 显示该核 %soft 持续 >20%,说明下半部处理已成瓶颈
  • 软中断不绑定 CPU,但执行受当前运行核限制;它会在中断退出后立即在**触发它的那个 CPU** 上执行,所以 IRQ 绑定不均 → softirq 也必然不均
  • 不能只调 IRQ,还得配合网卡多队列:用 ethtool -l eth0 看最大通道数,再用 ethtool -L eth0 combined 4 开足队列,最后确保每个队列有独立 IRQ(cat /proc/interrupts | grep eth0 应看到多个不同 IRQ 号)
  • RSS(接收侧缩放)必须与网卡驱动、固件、交换机 flow control 全链路匹配;否则即使开了 8 个队列,流量仍全打到第一个 IRQ

真正难的不是改哪一行配置,而是确认改动后有没有形成闭环:IRQ 分散了 → 对应的 softirq 是否同步摊开 → 业务线程是否真的没再被同核中断打断 → L1/L2 缓存命中率有没有回升。这些必须用 perf stat -C 1 -e cycles,instructions,cache-references,cache-misses 对比验证,而不是只盯着 /proc/interrupts 数字变小就收工。

本文地址:https://www.sztg.com.cn/article/644694.html

如非特殊说明,本站内容均来自于网友自主分享,如有任何问题均请联系我们进行处理!

猜您喜欢