ethtool -n 仅支持依赖硬件的有限流分类,不能自定义过滤规则;需结合 rss、rfs/rps 和 irq 亲和性实现流量定向到特定核心,且仅部分网卡支持 ntuple。

ethtool -N 本身不支持“自定义硬件过滤规则”,它仅提供对网卡内置的有限流分类(flow classification)功能的配置接口,且能力高度依赖网卡硬件和驱动支持。真正实现“特定流量定向到特定核心”,需结合硬件接收侧缩放(RSS)、流导向(RFS/RPS)和中断亲和性(IRQ affinity)协同完成,ethtool -N 只是其中一环,且仅适用于部分支持 NTUPLE 或 RX flow hashing 的网卡(如 Intel igb/ixgbe/i40e、Chelsio T4/T5 等)。
确认网卡是否支持 ethtool -N 流过滤
并非所有网卡都支持基于五元组的硬件流过滤(NTUPLE)。执行以下命令检查:
ethtool -n eth0
若输出中显示 "NTUPLE filters: on" 或列出支持的字段(如 src ip, dst port, proto),说明具备基础 NTUPLE 能力;若提示 "Not supported" 或无 NTUPLE 相关字段,则无法用 -N 实现精确匹配分流,应转向 RSS + RPS/RFS 方案。
使用 ethtool -N 配置简单五元组规则(仅限支持网卡)
以将目的端口 8080 的 TCP 流量重定向到 RX 队列 3 为例(假设网卡有至少 4 个 RX 队列):
ethtool -N eth0 flow-type tcp4 dst-port 8080 action 3
注意要点:
- 必须先启用 NTUPLE:`ethtool -K eth0 ntuple on`(部分驱动要求)
- action 后的数字是 RX 队列索引(从 0 开始),不是 CPU 核心编号
- 规则优先级由添加顺序决定,后加的规则可能被先加的覆盖(取决于驱动)
- 不支持通配符组合(如 “src-ip 192.168.1.0/24 and dst-port 22” 在多数驱动中无效)
- 规则数受限(常见上限 16–128 条),且重启后丢失,需写入启动脚本持久化
将 RX 队列绑定到指定 CPU 核心(关键步骤)
ethtool -N 只决定数据包进入哪个 RX 队列,真正决定由哪个 CPU 处理,需设置 IRQ 亲和性:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
# 查看 eth0 对应的 RX 队列中断号(通常形如 eth0-TxRx-0, eth0-TxRx-1...) ls /proc/interrupts | grep eth0 <h1>将第 3 号 RX 队列中断(如 irq 123)绑定到 CPU 3</h1><p>echo 8 > /proc/irq/123/smp_affinity_list # CPU 3 对应掩码 bit 3(即 2^3 = 8)</p>
更可靠的方式是使用 irqbalance 关闭 + 手动绑定脚本,或借助 scripts/set_irq_affinity(内核源码自带工具)自动按队列分配 CPU。
补充增强:启用 RPS/RFS 提升软件层负载均衡
当硬件 RSS/NTUPLE 不足或需更高粒度调度时,可启用软件辅助:
-
RPS(Receive Packet Steering):在软中断上下文将包推送到指定 CPU 的 backlog 队列
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus # 允许 CPU 0–3 处理该 RX 队列的包 -
RFS(Remote Flow Steering):配合应用程序的 socket 绑定,将同一连接的响应包也导向相同 CPU,减少 cache miss
echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
echo 2048 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
RPS/RFS 是纯软件方案,不依赖网卡特性,但会增加少量调度开销。
不复杂但容易忽略:硬件过滤(-N)只是入口分流,CPU 绑定(IRQ affinity)才是决定处理核心的关键,而 RPS/RFS 是兜底与优化手段。三者需配合验证,用 perf record -e irq:softirq_entry -g 或 /proc/interrupts 实时观察中断分布,再用 cat /proc/net/snmp 检查丢包,才能确认定向生效。










