Solaris 11.4多NVMe设备中断向量不足问题及跨级别中断配置咨询
你遇到的这个中断向量耗尽问题,在高密度NVMe部署的Solaris环境里确实挺头疼的,先帮你梳理下情况:你用的是Supermicro H12SSL主板搭配16核Epyc处理器,跑Solaris 11.4.42.111.0,算上PCIe扩展卡和主板自带的插槽,一共22个NVMe位,原本想全插满做低功耗ZFS文件服务器+轻量非内核Zone,结果Solaris最多只认13个,还报No interrupt vector: pciex...的错误。
你通过mdb -k里的::interrupts命令排查,发现level 5中断级别里ahci驱动占了4个向量,nvme驱动占了28个(每个NVMe插槽要占2个)。之后你修改/kernel/drv/ahci.conf把ahci指定到level 6,腾出了4个level 5的向量,能多认2个NVMe(总共16个),但离22个的目标还差不少。现在你想把nvme的中断分散到level 5和level 6,但试了interrupt-priorities = 5,6;没效果,问怎么配置才对。
正确的nvme.conf配置方式
Solaris里NVMe驱动的中断优先级配置,单纯写interrupt-priorities = 5,6;确实不会生效,因为这个参数需要结合设备实例或者通配符做精准匹配,驱动才会按指定规则分配中断级别。给你两种可行的配置思路:
- 分实例指定中断级别
先通过prtconf -D | grep nvme列出所有NVMe设备的实例编号,然后在/kernel/drv/nvme.conf里分组指定:
# 前10个NVMe实例绑定到level 5 nvme* instance <0-9> { interrupt-priorities = 5; } # 剩余NVMe实例绑定到level 6 nvme* instance <10-21> { interrupt-priorities = 6; }
这样就能把NVMe设备的中断分散到两个级别,充分利用空闲的中断向量。
- 全局多级别配置(需验证)
如果不想分实例,也可以尝试用通配符全局指定多个优先级,不过这种方式部分版本的Solaris NVMe驱动可能不支持,你可以试试:
nvme* { interrupt-priorities = [5,6]; }
配置修改后,记得重启系统(或者用update_drv -v nvme重新加载驱动,但重启更稳妥),之后再用::interrupts验证中断分配情况。
额外优化建议
- 先确认level 6的剩余中断资源:你之前看到level 6只有bge和nge驱动,用
::interrupts再仔细查下level 6还剩多少可用向量,避免移过去又占满。 - 调整中断亲和性:利用Epyc的多核优势,把不同NVMe的中断绑定到不同CPU核心,既能缓解向量压力,还能提升性能。可以用
intrctl命令配置:
intrctl set -i <中断号> -c <核心列表>
- 检查Solaris补丁:你的版本是11.4.42.111.0,Oracle后续可能发布过针对中断向量分配的补丁,如果有支持授权,可以查下官方文档看看有没有适配的补丁。
- 排查PCIe拓扑:用
prtpicl -v查看PCIe设备的中断组分布,有些插槽可能共享中断资源,调整NVMe卡的插槽位置说不定能缓解冲突。
备注:内容来源于stack exchange,提问作者ARZ Lab

