如何检查哪些 CPU 核心正在为特定 NIC 提供 rx 队列服务以及是否启用了 RPS

如何检查哪些 CPU 核心正在为特定 NIC 提供 rx 队列服务以及是否启用了 RPS

在我的主机(RHEL 6.3,2.6.x 内核)上,eth2 生成 irq # 60-65。我通过 /proc/interrupts 对其进行了验证。

/proc/irq/61-65/smp_affinity 显示 5 个队列的以下位集

  1. 1000

  2. 0040

  3. 0400

  4. 0100

  5. 0010

我将它们读取为 CPU 核心 ID:-

  1. 12(用于位掩码 1000)
  2. 6(用于位掩码 0040)
  3. 10(用于位掩码 0400)
  4. 2(用于位掩码 0004)
  5. 8(用于位掩码 0100)
  6. 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 的幂,因此您可以使用此代码片段进行bclog2 计算以从幂中获取 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

相关内容