作为我们正在运行的优化 Linux 机器上应用程序性能的实验的一部分,我们尝试将所有网络中断分配给单个 CPU 核心。
不幸的是,它似乎没有按应有的方式工作。例如,我们这里有一个中断:
[root@shou18librh05 ~]# cat /proc/interrupts | grep 107
107: 0 0 0 0 0 0 0 0 PCI-MSI-X eth-mlx4-0
目前在哪里处理?
[root@shou18librh05 ~]# cat /proc/irq/107/smp_affinity
7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff
尝试将其移动到第一个核心:
[root@shou18librh05 ~]# echo 1 > /proc/irq/107/smp_affinity
它動了嗎?
[root@shou18librh05 ~]# cat /proc/irq/107/smp_affinity
7fffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff,ffffffff
不...
有人知道为什么会发生这种情况吗?谷歌搜索没有给出任何明显的解决方案/提示...
Linux 是:
[root@shou18librh05 ~]# uname -a
Linux shou18librh05 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
答案1
很可能您的系统上有一些已禁用的设备,它们利用了 CPU1 的中断向量空间,特别是由于这些设备尚未启用,它们的中断号未出现在 /proc/interrupts 中。irq 到 CPU 向量的分配是在内核的 APIC 中完成的。
请尝试一下它是否适合您:
- 识别任何未连接但尚未启用的设备,
- 启用它们,例如:ifup(用于接口)
- 它们的 int 号应该显示在 /proc/interrupts 中
- 尝试将除 1 之外的所有 CPU 分配给所有中断。
- 然后尝试将 CPU1 分配给您喜欢的中断。但请记住每个 CPU 的向量空间都有限制,因此特定 CPU 可以处理的中断数量应该是最大的。