bash
ethtool -l nic0
Channel parameters for nic0:
Pre-set maximums:
RX: n/a
TX: n/a
Other: n/a
Combined: 63
Current hardware settings:
RX: n/a
TX: n/a
Other: n/a
Combined: 63
[hyperai] root@gtx5090-7:~# ethtool -l nic1
Channel parameters for nic1:
Pre-set maximums:
RX: n/a
TX: n/a
Other: n/a
Combined: 63
Current hardware settings:
RX: n/a
TX: n/a
Other: n/a
Combined: 63
[hyperai] root@gtx5090-7:~# ethtool -x nic0
RX flow hash indirection table for nic0 with 63 RX ring(s):
0: 0 1 2 3 4 5 6 7
8: 8 9 10 11 12 13 14 15
16: 16 17 18 19 20 21 22 23
24: 24 25 26 27 28 29 30 31
32: 32 33 34 35 36 37 38 39
40: 40 41 42 43 44 45 46 47
48: 48 49 50 51 52 53 54 55
56: 56 57 58 59 60 61 62 0
64: 1 2 3 4 5 6 7 8
72: 9 10 11 12 13 14 15 16
80: 17 18 19 20 21 22 23 24
88: 25 26 27 28 29 30 31 32
96: 33 34 35 36 37 38 39 40
104: 41 42 43 44 45 46 47 48
112: 49 50 51 52 53 54 55 56
120: 57 58 59 60 61 62 0 1
128: 2 3 4 5 6 7 8 9
136: 10 11 12 13 14 15 16 17
144: 18 19 20 21 22 23 24 25
152: 26 27 28 29 30 31 32 33
160: 34 35 36 37 38 39 40 41
168: 42 43 44 45 46 47 48 49
176: 50 51 52 53 54 55 56 57
184: 58 59 60 61 62 0 1 2
192: 3 4 5 6 7 8 9 10
200: 11 12 13 14 15 16 17 18
208: 19 20 21 22 23 24 25 26
216: 27 28 29 30 31 32 33 34
224: 35 36 37 38 39 40 41 42
232: 43 44 45 46 47 48 49 50
240: 51 52 53 54 55 56 57 58
248: 59 60 61 62 0 1 2 3
RSS hash key:
d8:f8:eb:51:72:3c:36:da:9c:5f:2b:de:d2:d5:f2:ec:ee:a1:1f:37:6e:03:74:a1:be:0b:e0:bc:93:2d:e2:76:62:e9:7b:97:b6:3b:66:50
RSS hash function:
toeplitz: on
xor: off
crc32: off
[hyperai] root@gtx5090-7:~# ethtool -x nic1
RX flow hash indirection table for nic1 with 63 RX ring(s):
0: 0 1 2 3 4 5 6 7
8: 8 9 10 11 12 13 14 15
16: 16 17 18 19 20 21 22 23
24: 24 25 26 27 28 29 30 31
32: 32 33 34 35 36 37 38 39
40: 40 41 42 43 44 45 46 47
48: 48 49 50 51 52 53 54 55
56: 56 57 58 59 60 61 62 0
64: 1 2 3 4 5 6 7 8
72: 9 10 11 12 13 14 15 16
80: 17 18 19 20 21 22 23 24
88: 25 26 27 28 29 30 31 32
96: 33 34 35 36 37 38 39 40
104: 41 42 43 44 45 46 47 48
112: 49 50 51 52 53 54 55 56
120: 57 58 59 60 61 62 0 1
128: 2 3 4 5 6 7 8 9
136: 10 11 12 13 14 15 16 17
144: 18 19 20 21 22 23 24 25
152: 26 27 28 29 30 31 32 33
160: 34 35 36 37 38 39 40 41
168: 42 43 44 45 46 47 48 49
176: 50 51 52 53 54 55 56 57
184: 58 59 60 61 62 0 1 2
192: 3 4 5 6 7 8 9 10
200: 11 12 13 14 15 16 17 18
208: 19 20 21 22 23 24 25 26
216: 27 28 29 30 31 32 33 34
224: 35 36 37 38 39 40 41 42
232: 43 44 45 46 47 48 49 50
240: 51 52 53 54 55 56 57 58
248: 59 60 61 62 0 1 2 3
RSS hash key:
d8:f8:eb:51:72:3c:36:da:9c:5f:2b:de:d2:d5:f2:ec:ee:a1:1f:37:6e:03:74:a1:be:0b:e0:bc:93:2d:e2:76:62:e9:7b:97:b6:3b:66:50
RSS hash function:
toeplitz: on
xor: off
crc32: off
[hyperai] root@gtx5090-7:~# ls /sys/class/net/nic0/queues/|grep rx|uniq |sort -n
rx-0
rx-1
rx-10
rx-100
rx-101
rx-102
rx-103
rx-104
rx-105
rx-106
rx-107
rx-108
rx-109
rx-11
rx-110
rx-111
rx-112
rx-113
rx-114
rx-115
rx-116
rx-117
rx-118
rx-119
rx-12
rx-120
rx-121
rx-122
rx-123
rx-124
rx-125
rx-13
rx-14
rx-15
rx-16
rx-17
rx-18
rx-19
rx-2
rx-20
rx-21
rx-22
rx-23
rx-24
rx-25
rx-26
rx-27
rx-28
rx-29
rx-3
rx-30
rx-31
rx-32
rx-33
rx-34
rx-35
rx-36
rx-37
rx-38
rx-39
rx-4
rx-40
rx-41
rx-42
rx-43
rx-44
rx-45
rx-46
rx-47
rx-48
rx-49
rx-5
rx-50
rx-51
rx-52
rx-53
rx-54
rx-55
rx-56
rx-57
rx-58
rx-59
rx-6
rx-60
rx-61
rx-62
rx-63
rx-64
rx-65
rx-66
rx-67
rx-68
rx-69
rx-7
rx-70
rx-71
rx-72
rx-73
rx-74
rx-75
rx-76
rx-77
rx-78
rx-79
rx-8
rx-80
rx-81
rx-82
rx-83
rx-84
rx-85
rx-86
rx-87
rx-88
rx-89
rx-9
rx-90
rx-91
rx-92
rx-93
rx-94
rx-95
rx-96
rx-97
rx-98
rx-99
[hyperai] root@gtx5090-7:~# ls /sys/class/net/nic1/queues/|grep rx|uniq |sort -n
rx-0
rx-1
rx-10
rx-100
rx-101
rx-102
rx-103
rx-104
rx-105
rx-106
rx-107
rx-108
rx-109
rx-11
rx-110
rx-111
rx-112
rx-113
rx-114
rx-115
rx-116
rx-117
rx-118
rx-119
rx-12
rx-120
rx-121
rx-122
rx-123
rx-124
rx-125
rx-13
rx-14
rx-15
rx-16
rx-17
rx-18
rx-19
rx-2
rx-20
rx-21
rx-22
rx-23
rx-24
rx-25
rx-26
rx-27
rx-28
rx-29
rx-3
rx-30
rx-31
rx-32
rx-33
rx-34
rx-35
rx-36
rx-37
rx-38
rx-39
rx-4
rx-40
rx-41
rx-42
rx-43
rx-44
rx-45
rx-46
rx-47
rx-48
rx-49
rx-5
rx-50
rx-51
rx-52
rx-53
rx-54
rx-55
rx-56
rx-57
rx-58
rx-59
rx-6
rx-60
rx-61
rx-62
rx-63
rx-64
rx-65
rx-66
rx-67
rx-68
rx-69
rx-7
rx-70
rx-71
rx-72
rx-73
rx-74
rx-75
rx-76
rx-77
rx-78
rx-79
rx-8
rx-80
rx-81
rx-82
rx-83
rx-84
rx-85
rx-86
rx-87
rx-88
rx-89
rx-9
rx-90
rx-91
rx-92
rx-93
rx-94
rx-95
rx-96
rx-97
rx-98
rx-99
[hyperai] root@gtx5090-7:~# grep mlx5 /proc/interrupts | wc -l
128 我这个到底有多少网卡队列 为啥 每张网卡的rx 都是126
你这个现象的关键在于:你看到的是不同层面的"队列",它们不是一个概念。
你现在机器上的数据:
| 查看方式 | 结果 | 含义 |
|---|---|---|
ethtool -l nic0 |
Combined: 63 | 网卡当前配置的 硬件 channel 数 / RSS ring 数 |
ethtool -x nic0 |
63 RX ring(s) | RSS 实际使用的 RX ring 数 |
/proc/interrupts |
128 个 mlx5 IRQ | 两个 PF 各 64 个 completion IRQ(包含 async) |
/sys/class/net/nic0/queues/rx-* |
rx-0 ~ rx-125 | Linux netdev queue 映射,不等于 RSS queue |
你的真实网络队列应该这样理解
你的硬件:
PCI:
0000:c2:00.0
0000:c2:00.1
两个 function:
c2:00.0 -> nic0
c2:00.1 -> nic1
每个:
Combined channel = 63
所以:
nic0:
RX ring: 63
TX ring: 63
nic1:
RX ring: 63
TX ring: 63
总 RSS RX:
63 × 2 = 126
为什么 /sys 里面是 rx-0 到 rx-125?
这里最容易误解。
Linux 的:
/sys/class/net/nic0/queues/
不是直接显示硬件 RSS ring。
它显示的是 netdev queue namespace。
mlx5 驱动会创建更多 queue 对象,例如:
-
channel queue
-
completion queue 映射
-
XDP queue
-
内核内部 queue
所以:
rx-0 ~ rx-125
不代表:
126 个 RSS RX ring
因为你的 RSS 已经证明:
ethtool -x:
63 RX ring(s)
这个才是 RSS 层面的真实数量。
为什么 grep mlx5 是 128?
你执行:
grep mlx5 /proc/interrupts | wc -l
得到:
128
原因:
每个 PF:
mlx5_async0
+
mlx5_comp0 ~ mlx5_comp62
数量:
1 async
+
63 completion
=
64 IRQ
两个 PF:
64 × 2 = 128
完全对应。
所以:
nic0:
mlx5_async0
mlx5_comp0-62
nic1:
mlx5_async0
mlx5_comp0-62
你的最终拓扑应该画成:
Mellanox PF0 nic0
|
RSS 63 RX rings
|
comp0 ---------------- comp62
| |
IRQ251? IRQ314?
| |
CPU NUMA1 CPU NUMA1
Mellanox PF1 nic1
|
RSS 63 RX rings
|
comp0 ---------------- comp62
|
CPU NUMA1
所以你的答案:
每张网卡到底多少 RX 队列?
严格说:
-
RSS RX ring:63 个
-
/sys/class/net/.../queues/rx-*显示:126 个(驱动 queue 对象) -
IRQ completion queue:63 个
对于调 RPS、IRQ affinity、softirq:
看 63 个 RSS ring / mlx5_comp IRQ。
不要按照:
rx-0 ~ rx-125
去绑 CPU。
下一步你应该确认 IRQ CPU 分布
执行:
for irq in $(grep mlx5_comp /proc/interrupts | awk -F: '{print $1}'); do
echo -n "$irq "
cat /proc/irq/$irq/smp_affinity_list
done | head -20
你现在最关心的是:
是不是:
128-255
384-511
如果是:
你的 RSS + IRQ + NUMA 已经正确。
如果出现:
0-127
那才需要调 irqbalance 或手工绑 IRQ。
目前从你贴出的信息看,网卡队列配置本身没有问题,RPS 是否开启才是下一步重点。