用awk按设备名统计中断频次:awk '{print $(NF)}' /proc/interrupts | sort | uniq -c | sort -nr | head -10,该命令安全提取最后一列设备名并降序列出频次最高的前10个设备。

怎么用 awk 快速按设备名统计中断频次
/proc/interrupts 本身不分类,只列原始行;真正要看出“谁在狂打中断”,得靠 awk 提取最后一列(设备名)并聚合计数。常见错误是直接 grep eth0 —— 但网卡可能注册为 eth0-rx-0、enp0s3f2 或带 MSI 编号的长名,漏掉就白忙。
- 用
awk '{print $(NF)}'安全提取最后一列,它自动跳过空格和缩进 - 加
sort | uniq -c | sort -nr得到降序频次表,前 10 名基本覆盖 90% 异常源 - 避免写
awk '{print $NF}'($NF 在空行会报错),$(NF)更健壮 - 示例命令:
awk '{print $(NF)}' /proc/interrupts | sort | uniq -c | sort -nr | head -10
为什么 grep “PCI-MSI” 比看 IRQ 编号更靠谱
IRQ 编号(如 42、128)在虚拟化或启用 IRQ remapping 后已失去物理意义;IR-PCI-MSI、PCI-MSI 这类前缀才是设备真实身份标签。看到 IR-PCI-MSI 32768 别去查 32768 号引脚——它只是 KVM 分配的虚拟中断号,归属得看后面设备地址,比如 0000:01:00.0。
- 直接
grep -E 'PCI-MSI|IR-PCI-MSI' /proc/interrupts筛出 PCIe 设备中断,它们占性能敏感中断的 80% 以上 - 再用
awk '{print $1, $(NF)}'抽出 IRQ 号和设备地址,方便后续查亲和性或驱动日志 - 注意:
IO-APIC类中断多属传统设备(串口、声卡),增长慢但持续;PCI-MSI类一旦突增,大概率是网卡丢包、NVMe 超时或 GPU 驱动异常
怎么识别“假安静”设备——中断计数为 0 却在干活
看到某行全为 0 别急着排除,现代设备常绕过中断路径:ethtool -C eth0 rx off 关中断收包、NVMe 启用 polling mode、iGPU 用 DRM atomic commit,都会让对应 IRQ 计数冻结。
- 先确认是否启用轮询:
ethtool -c eth0查rx-usecs和rx-frames是否非零 - 查 NVMe 是否启用 polling:
cat /sys/block/nvme0n1/queue/poll返回 1 表示开启 - 看内核是否禁用该 IRQ 的 handler:
cat /proc/irq/*/trigger(若存在)或grep -r "disable" /sys/firmware/acpi/ - 最直接验证:用
perf record -e irq:irq_handler_entry -a sleep 5,真没中断触发才说明路径被绕过
lsirq 输出里 “Affinity” 列为 0x00000001 是危险信号
lsirq -v 的 Affinity 列显示十六进制掩码,0x00000001 表示只绑 CPU0,哪怕系统有 32 核——这是中断风暴的温床。但别直接改 smp_affinity,x86 和 ARM 掩码位宽不同,写错会导致中断永久丢失。
- 先查
/proc/irq/*/effective_affinity,如果和smp_affinity_list不一致,说明irqbalance正在动态干预 - 改之前停掉
irqbalance:sudo systemctl stop irqbalance - 用
smp_affinity_list(十进制 CPU 列表)而非smp_affinity(十六进制掩码)设置,例如echo "0,2,4,6" | sudo tee /proc/irq/42/smp_affinity_list - 改完立刻验证:
watch -n 1 'cat /proc/interrupts | grep "^42:"',观察各 CPU 列是否开始均匀增长
真正难的是把 /proc/interrupts 里的数字和硬件行为对上——同一行里 i915 中断暴涨,可能是页面翻转,也可能是 HDMI 热插拔误报;nvme0n1 突增,得先分清是读密集还是写超时。这些没法靠一行命令判明,得结合 trace-cmd 抓 handler 耗时,再比对 dmesg 里的 nvme 错误。


















