CPU 与调度60 条

threadirqs 中断线程化

内核参数 threadirqs 让大部分中断处理程序以内核线程运行,可对其设置调度策略与亲和性,便于控制中断抖动。

参数是什么

threadirqs 是内核启动参数,强制把绝大多数中断处理程序改以内核线程(名字形如 irq/<n>-<设备>)运行,而不是在硬中断上下文里直接执行。线程化之后中断处理变成可调度实体:能设优先级、绑核、用 perf/ftrace 观察其耗时,便于控制抖动的来源与优先级;代价是每次中断多一次唤醒与上下文切换开销,且个别驱动在该模式下表现与其他模式不同。

基本信息

启用方式内核命令行加 threadirqs 后重启(运行期无法切换)
配置位置Debian/Ubuntu 改 /etc/default/grub;RHEL 系用 grubby
验证grep -o threadirqs /proc/cmdline 与 ps 中的 irq/ 线程
默认优先级中断线程默认以 SCHED_FIFO 优先级 50 运行
可调手段chrt 改策略/优先级,smp_affinity_list 绑核
风险启动期全局生效,需测试环境压测后推广

典型使用场景

  • 需要区分「中断抢占业务」还是「业务自身耗时」时,线程化为可观测与可调优先级创造条件
  • 延迟敏感服务:把关键中断线程绑定到专用核并设置合适优先级,减少抖动
  • 排查中断处理耗时过长:线程化后可用 ftrace/perf 直接测量中断线程的运行时间
  • 复现丢包问题时人为降低某些中断线程的优先级,观察丢包是否加剧
  • 内核行为对比实验:评估该模式对本机网络吞吐与尾延迟的实际影响

启用与验证

启用与验证
grep -o threadirqs /proc/cmdline  # 先确认当前是否启用
# Debian/Ubuntu:在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 里加入 threadirqs
sudo update-grub  # 重建引导配置
# RHEL 系等价的免编辑做法:sudo grubby --update-kernel=ALL --args=threadirqs
sudo reboot  # 启动参数必须重启才生效
ps -eo pid,cls,rtprio,psr,comm | grep 'irq/' | head  # 查看中断线程的策略、优先级与所在核
chrt -p <irq_thread_pid>  # 查看单个中断线程的调度策略与优先级
echo 3 | sudo tee /proc/irq/40/smp_affinity_list  # 线程化后仍用亲和掩码控制落点

启用前后对照

项目未启用启用 threadirqs 后
中断处理上下文硬中断/软中断上下文内核线程,可被调度
能否设优先级不能可以(chrt/renice)
能否绑核通过 smp_affinity 控制同样可控,且线程可读可观测
可观测性主要靠 /proc/interrupts 计数还能用 perf/ftrace 看耗时
开销较低每次中断多一次唤醒与切换
中断线程默认以 SCHED_FIFO 50 运行,优先级高于绝大多数普通业务线程。把某些中断线程优先级调低会让处理被推迟甚至丢包;调得过高又可能频繁抢占业务线程,需按「吞吐优先」还是「延迟优先」明确目标再动手。
这是启动期参数,改错位置(例如直接编辑生成的 grub.cfg 而未重建)会导致不生效;改完必须重启并用 /proc/cmdline 复核,同时重新验证既有的绑核与 NUMA 方案是否仍然合理。

易错点

  • 个别驱动兼容性一般:启用后出现吞吐下降或异常报错时应回退,并在测试环境用与生产一致的负载验证
  • 把参数写进 grub.cfg 而不是 /etc/default/grub:内核升级或重建配置后被覆盖,表现为「改了没效果」
  • 改完不重启就判断无效:启动参数只在引导时读取,必须重启后再验证 /proc/cmdline
  • 随意调整中断线程优先级:降低会加剧丢包与延迟,抬高会抢占业务线程,两者都要以压测数据为准
  • 默认落点变化后沿用旧的绑核方案:线程化改变了中断的执行主体与迁移行为,原有亲和规划需要重新核对

数据来源与参考

  • Linux 内核 Documentation/core-api/genericirq.rst(强制线程化)
  • Linux 内核内核参数 threadirqs 文档
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌