在我的主机(RHEL 6.3,2.6.x 内核)上,eth2 生成 irq # 60-65。我通过 /proc/interrupts 对其进行了验证。
/proc/irq/61-65/smp_affinity 显示 5 个队列的以下位集
1000
0040
0400
0100
0010
我将它们读取为 CPU 核心 ID:-
- 12(用于位掩码 1000)
- 6(用于位掩码 0040)
- 10(用于位掩码 0400)
- 2(用于位掩码 0004)
- 8(用于位掩码 0100)
- 4(用于位掩码 0010)
我读得对吗?
我正在运行一个网络应用程序,该应用程序在 eth2 上每秒接收 10k 条消息。奇怪的是,我没有看到上述任何 CPU 核心 ID 处于繁忙状态,而只有奇数 CPU 核心 ID 处于繁忙状态。我无法将 smp_affinity 与 CPU 活动关联起来。
另外,/sys/class/net/eth2/queues/rx-[0-4]/rps_cpus 是 0000。这是否意味着 RPS 被禁用?
更新:1 除上述内容外,irqbalance 守护进程正在运行。它能覆盖 smp_affinity 吗?
更新:2 irqbalance --debug 显示以下内容
软件包 0:包含 CPU 0、2、4、6、8、10、12 软件包 1:包含 CPU 1、3、5、7、9、11、13、15
irqbalance 如何使用基于 numa 的系统的包信息。在我的系统上运行 lstopo 会产生 Socket 0 节点 0:核心 0、2、4、6 节点 1:核心 8、10、12、14
插槽 1 节点 2:核心 1、3、5、7 节点 3:核心 9、11、13、15
查看 numa 拓扑和 irqbalance 中的包,似乎 irq 将分布在各个节点上,但仅限于一个 Socket。不知道为什么。
另外,使用 lspci,我可以看到 eth2 正在使用 pci 总线 4,而节点 0 在 pci 总线 4 上。所以在我看来,最正常的事情是将 eth 2 中断分散到节点 0 上,而是它似乎分散在插槽 1 上。
答案1
我将它们读取为 CPU 核心 ID:-... 我读取的正确吗?
由于基本上这些数字只是每个 proc 数字的 2 的幂,因此您可以使用此代码片段进行bc
log2 计算以从幂中获取 N:
for N in 1000 40 400 100 10; do
echo -n "$N is "
echo "ibase=16; l($N) / l(2)" | bc -l | sed -e 's!\.000.*!!g'
done
→
1000 is 12
40 is 6
400 is 10
100 is 8
10 is 4
更新:除上述内容外,irqbalance 守护进程正在运行。它可以覆盖 smp_affinity 吗?
当然,如果您想要手动控制,则需要禁用irqbalance
。