游乐游手机版
首页/系统平台/文章详情

Linux如何查看网卡中断绑定情况的详细教程

时间:2026-07-10 07:15
排查网卡中断绑定需查看 proc irq * smp_affinity_list,通过 proc interrupts获取IRQ编号,核对实际亲和性effective_affinity并停用irqbalance。改绑定不生效常见于isolcpus隔离、掩码错误或驱动不响应。单队列时调整绑定意义不大,应先启用多队列后再分别绑定。

先说一个核心判断:要精准排查网卡中断绑定,直接查看 /proc/irq/*/smp_affinity_list 是最可靠的方式,不要被 topmpstat 显示的单个 CPU 高负载所迷惑——那些工具只能告诉你哪个核在忙,却无法说明这个核究竟绑定了哪个中断。

如何快速定位网卡对应的 IRQ 编号

网卡的中断号不能靠猜测,必须从 /proc/interrupts 中获取。具体操作并不复杂:

  • 先用 nmcli device statusip -br link show 确认当前的有效网卡名称,例如 enp1s0f0ens33
  • 接着运行 grep -i "enp1s0f0" /proc/interrupts,将名称替换为你的网卡名。输出类似:
    42: 1234567 0 0 0 890123 0 0 0 IR-PCI-MSI 32768-edge enp1s0f0-rx-0
    第一列的 42 就是 IRQ 编号。如果末尾带有 -rx--tx- 后缀,说明已启用多队列,每个后缀代表一个独立的中断。
  • 如果 grep 没有找到结果,可以尝试用驱动名称搜索:先执行 ethtool -i enp1s0f0 | grep driver 获取驱动名(如 i40emlx5_core),再运行 grep i40e /proc/interrupts

如何确认当前 IRQ 绑定到了哪些 CPU

获取 IRQ 编号后,有两个关键文件需要同时核查,缺一不可:

  • cat /proc/irq/42/smp_affinity_list:显示的是你写入的亲和性配置,输出为十进制的 CPU 编号列表。例如 0,2,4,6 表示该中断允许在这些 CPU 上运行;如果仅输出 0,则代表硬绑定到 CPU 0——这是单核瓶颈的直接证据。
  • cat /proc/irq/42/effective_affinity:显示内核实际生效的绑定情况。如果该值与 smp_affinity_list 不一致,很可能是 irqbalance 在后台自动调整。
  • 同时建议检查 systemctl is-active irqbalance,若返回 active,操作前务必执行 sudo systemctl stop irqbalance

为什么修改了 smp_affinity_list 却没有生效

这是一个典型问题。通常不是权限或路径错误,而是被以下三个容易忽略的细节所导致:

  • 目标 CPU 已被内核隔离:执行 cat /proc/cmdline,如果看到 isolcpus=1,2,则不要将绑定写入 CPU 1 或 2,否则写入会静默失败甚至触发警告。
  • 误用了 smp_affinity(十六进制掩码):x86 平台为 64 位,ARM 可能更宽,掩码长度错一位就容易将所有绑定分配到 CPU 0。相比之下,smp_affinity_list 是更易读的十进制列表,使用更为安全。
  • 驱动不支持 smp_affinity_list:某些驱动(如 mlx5_core)只识别 smp_affinity,但写入前必须先确认位宽。稳妥的做法是先尝试 smp_affinity_list,失败后再查阅驱动文档。

网卡未开启多队列时,查看中断绑定意义有限

如果 ethtool -l enp1s0f0 显示 Combined: 1,说明硬件只配置了 1 个接收队列。在这种情况下,无论如何调整 smp_affinity_list,也只有一个 IRQ 号可供绑定,所有网络包最终仍会集中到同一个中断上下文中。

此时正确的做法不是调整绑定,而是:

  • 先启用多队列:sudo ethtool -l enp1s0f0 combined 4(通常设置为 CPU 核数的一半或匹配 NUMA 节点)。
  • 再确认网卡是否支持 RPS:ls /sys/class/net/enp1s0f0/queues/rx-*,若能见到多个 rx-* 目录才表示队列已激活。
  • 最后对每个 rx-0rx-1 对应的 IRQ 分别绑定到不同的 CPU 上。

中断绑定并非万能开关。它是多队列、NUMA 对齐以及停用 irqbalance 三者协同才能发挥作用的结果。如果遗漏其中任意一环,你所看到的都只是表象。

来源:https://www.php.cn/faq/2794667.html
上一篇Linux系统删除自定义别名alias的常用方法与技巧教程 下一篇Linux系统下Nginx连接池当前状态完整查看方法详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
如何用Linux查看网络数据包在内核的流向
系统平台 · 2026-07-10

如何用Linux查看网络数据包在内核的流向

tcpdump在链路层入口后、IP层解析前捕获,可看到MAC地址等头部;perf配合kprobe可跟踪skb在内核中的函数调用路径; proc net snmp等文件通过协议栈丢包计数反映流向瓶颈;iptablesTRACE仅在netfilter钩子打日志,不适合追踪真实流向。需交叉验证多种工具。

如何在CentOS 7中修改文件系统配额的具体操作步骤
系统平台 · 2026-07-10

如何在CentOS 7中修改文件系统配额的具体操作步骤

修改XFS文件系统配额时,需先在 etc fstab挂载点启用uquota或gquota选项,然后重新挂载文件系统使配额生效。之后以xfs_quota-x专家模式为用户或组设置软硬限制。修改后务必执行report命令验证,并检查输出确保限制值已写入且用量被正确统计。

Linux查看具体硬件驱动列表的命令
系统平台 · 2026-07-10

Linux查看具体硬件驱动列表的命令

在Linux系统中,查看硬件驱动列表,可使用lsmod命令查看已加载模块(但内置驱动不显示),使用lspci-k命令查看PCI设备当前驱动,使用lsusb-t命令查看USB设备驱动。需特别注意驱动与固件缺失问题,使用dmesg|grepfirmware命令可辅助排查驱动和固件缺失。

电脑0x800401f3无效类字符串系统底层报错解决
系统平台 · 2026-07-10

电脑0x800401f3无效类字符串系统底层报错解决

错误0x800401f3无效的类字符串,因系统找不到COM组件注册信息或权限不足导致。需先定位出错组件的ProgID,检查注册表HKEY_CLASSES_ROOT下对应项是否存在,若缺失则使用regsvr32命令重新注册对应的DLL文件,再修改ProgID及CLSID子项的权限,赋予Everyone完全控制,最后重启IIS服务或相关应用程序池使更改生效。

统信UOS更换系统图标包详细教程
系统平台 · 2026-07-10

统信UOS更换系统图标包详细教程

统信UOS更换系统图标包可通过三种途径实现:控制中心直接切换已安装主题、手动复制图标包至用户目录并更新缓存、使用深度商店一键安装。三种方式分别适合不同技术能力的用户,均能即时生效,提升操作效率与视觉体验。