Ubuntu 22低延迟内核5.15下提升网卡中断优先级的问题
Ubuntu 22低延迟内核5.15下提升网卡中断优先级的问题
我完全理解你的困扰——在Ubuntu 18.04的低延迟内核上,你能轻松找到网卡对应的中断线程,用chrt调整优先级来保障10ms间隔的同步任务不被延迟,但到了Ubuntu 22.04的5.15低延迟内核,这些线程突然消失了,老办法没法用了对吧?下面给你拆解问题原因和解决办法:
一、核心变化:中断线程化的默认配置改了
你已经通过内核配置参数找到了关键差异:
- Ubuntu 18.04的4.15低延迟内核不仅开启了
CONFIG_IRQ_FORCED_THREADING=y(支持中断线程化),还默认启用了CONFIG_IRQ_FORCED_THREADING_DEFAULT=y,这意味着所有中断都会自动被线程化,所以你能看到irq/46-i40e-eno这类专属线程。 - 而Ubuntu 22.04的5.15低延迟内核只保留了
CONFIG_IRQ_FORCED_THREADING=y(具备线程化能力),但没有开启默认强制线程化,也没在启动参数里加入threadirqs,所以网卡中断默认不会被转换成独立线程,自然在ps里找不到它们。
二、解决办法:添加threadirqs内核启动参数
没错,解决方法就是这么直接——给内核加上threadirqs启动参数,步骤如下:
- 编辑GRUB配置文件:
sudo nano /etc/default/grub - 找到
GRUB_CMDLINE_LINUX_DEFAULT行,在引号内追加threadirqs,比如原本的配置是quiet splash,修改后变成:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash threadirqs" - 更新GRUB使配置生效:
sudo update-grub - 重启服务器,之后你就能像在Ubuntu 18上那样,看到网卡对应的
irq/XX-i40e-eno线程了。
重启后,你可以用原来的脚本批量调整优先级:
NIC=eno4 grep $NIC /proc/interrupts \ | awk '{print substr($1, 0, length($1) - 1);}' \ | xargs -I% sh -c "ps -e | grep irq/%-" \ | awk '{print $1;}' \ | xargs -I% sh -c "echo irq PID %; chrt -p 80 %"
或者手动对每个线程执行chrt -p 80 <线程PID>即可。
三、为什么默认配置会变化?
这个调整是Ubuntu团队出于通用性和性能平衡的考虑做出的:强制线程化所有中断虽然对低延迟场景(比如你的10ms同步任务)很友好,但并不是所有工作负载都需要——有些场景下,线程化中断会带来额外的调度开销,反而影响性能。后续版本的低延迟内核选择把这个控制权交给用户,让大家根据自己的实际需求来决定是否启用中断线程化,而不是默认开启。
备注:内容来源于stack exchange,提问作者Jonas
相关产品推荐
相关产品推荐

