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

在我的主机(RHEL 6.3,26.x内核)上,eth2生成irq#60-65。 我通过/ proc / interruptsvalidation了它。

/ 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)

我读他们正确吗?

我正在运行一个networking应用程序,它在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

看irmabalance的numa拓扑结构和包,似乎irqs将遍布节点,但限于一个套接字。 不知道为什么。

另外,使用lspci,我可以看到eth2使用的是PCI总线4,而节点0是在PCI总线4上。所以在我看来,最常见的情况是在节点0上传播eth 2中断,而似乎是通过Socket 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