如何在 Xen XCP 内更改 Ubuntu PV domU 上 IRQ 的 SMP 亲和性?

如何在 Xen XCP 内更改 Ubuntu PV domU 上 IRQ 的 SMP 亲和性?

我想更改 IRQ SMP 亲和性,原因如下:CPU0 被 eth1 中断淹没

但我不能——Input/output error当我尝试写入时我看到了/proc/irq/*/smp_affinity

请告诉我关于此事的 HOWTO。(正式的参考资料/proc/irq/*/也很好。)

血腥细节:

请注意,这是基于 Ubuntu 的 Xen XCP 主机内的虚拟机(PV domU)。

$ uname -a
Linux MYHOST 2.6.38-15-virtual #59-Ubuntu SMP 2012 年 4 月 27 日星期五 16:40:18 UTC i686 i686 i386 GNU/Linux

$ lsb_release-a
无可用的 LSB 模块。
分销商 ID:Ubuntu
描述:Ubuntu 11.04
发行:11.04
代号:natty

$ sudo cat /proc/irq/*/smp_affinity
01
01
01
01
01
80
80
80
80
80
80
40
40
40
40
40
40
20
20
20
20
20
20
10
10
10
10
10
10
08
08
08
08
08
08
04
04
04
04
04
04
02
02
02
02
02
02
01
01
01
01
01
01

更新。错误详细信息:

$ N=$(grep -c 处理器 /proc/cpuinfo)
$ 回显 $N
8

$ printf %x $((2**N-1))
ff

$ printf %x $((2**N-1)) | sudo tee /proc/irq/*/smp_affinity
fftee:/proc/irq/288/smp_affinity:输入/输出错误
tee:/proc/irq/289/smp_affinity:输入/输出错误
tee:/proc/irq/290/smp_affinity:输入/输出错误
tee:/proc/irq/291/smp_affinity:输入/输出错误
tee:/proc/irq/292/smp_affinity:输入/输出错误
tee:/proc/irq/293/smp_affinity:输入/输出错误
tee:/proc/irq/294/smp_affinity:输入/输出错误
tee:/proc/irq/295/smp_affinity:输入/输出错误
tee:/proc/irq/296/smp_affinity:输入/输出错误
tee:/proc/irq/297/smp_affinity:输入/输出错误
tee:/proc/irq/298/smp_affinity:输入/输出错误
tee:/proc/irq/299/smp_affinity:输入/输出错误
tee:/proc/irq/300/smp_affinity:输入/输出错误
tee:/proc/irq/301/smp_affinity:输入/输出错误
tee:/proc/irq/302/smp_affinity:输入/输出错误
tee:/proc/irq/303/smp_affinity:输入/输出错误
tee:/proc/irq/304/smp_affinity:输入/输出错误
tee:/proc/irq/305/smp_affinity:输入/输出错误
tee:/proc/irq/306/smp_affinity:输入/输出错误
tee:/proc/irq/307/smp_affinity:输入/输出错误
tee:/proc/irq/308/smp_affinity:输入/输出错误
tee:/proc/irq/309/smp_affinity:输入/输出错误
tee:/proc/irq/310/smp_affinity:输入/输出错误
tee:/proc/irq/311/smp_affinity:输入/输出错误
tee:/proc/irq/312/smp_affinity:输入/输出错误
tee:/proc/irq/313/smp_affinity:输入/输出错误
tee:/proc/irq/314/smp_affinity:输入/输出错误
tee:/proc/irq/315/smp_affinity:输入/输出错误
tee:/proc/irq/316/smp_affinity:输入/输出错误
tee:/proc/irq/317/smp_affinity:输入/输出错误
tee:/proc/irq/318/smp_affinity:输入/输出错误
tee:/proc/irq/319/smp_affinity:输入/输出错误
tee:/proc/irq/320/smp_affinity:输入/输出错误
tee:/proc/irq/321/smp_affinity:输入/输出错误
tee:/proc/irq/322/smp_affinity:输入/输出错误
tee:/proc/irq/323/smp_affinity:输入/输出错误
tee:/proc/irq/324/smp_affinity:输入/输出错误
tee:/proc/irq/325/smp_affinity:输入/输出错误
tee:/proc/irq/326/smp_affinity:输入/输出错误
tee:/proc/irq/327/smp_affinity:输入/输出错误
tee:/proc/irq/328/smp_affinity:输入/输出错误
tee:/proc/irq/329/smp_affinity:输入/输出错误
tee:/proc/irq/330/smp_affinity:输入/输出错误
tee:/proc/irq/331/smp_affinity:输入/输出错误
tee:/proc/irq/332/smp_affinity:输入/输出错误
tee:/proc/irq/333/smp_affinity:输入/输出错误
tee:/proc/irq/334/smp_affinity:输入/输出错误
tee:/proc/irq/335/smp_affinity:输入/输出错误

更新。 irqbalance在跑:

$ sudo 服务 irqbalance 状态
irqbalance 启动/运行,进程 560

答案1

我不认为将中断转移到不同的 CPU(尤其是处理网络事件)会提高性能。

相反的情况会发生,因为网络代码不能再保存在特定的 CPU 中。

因此,只要您的网络接口没有遇到丢包的情况,我想说 - 对于服务于许多数据包的网络来说,这是相当正常的行为。

您需要降低中断的数量 - 移动它们不会有帮助(相反,正如我试图概述的那样)。

我看到两种可能的解决方案:

  • 增加 MTU 大小以减少中断次数
  • 将 DomU 的 vCPU 0 PIN 到 Dom0 上的专用 CPU(未被任何其他 VM 或 Dom0 使用)。

更新2012-12-17:既然你要求权威链接 - 我试着问一个一般性的问题何时不使用虚拟化- 我认为这是达到一般 VM 限制的情况之一。该问题的答案之一包含不同的方法:使用容器,而不是虚拟化。

我希望这有帮助...

答案2

有一个名为的文件Documentation/IRQ-affinity.txt在 Linux 源代码中。

/proc/irq/IRQ#/smp_affinity specifies which target CPUs are permitted
for a given IRQ source. It's a bitmask of allowed CPUs. It's not allowed
to turn off all CPUs, and if an IRQ controller does not support IRQ
affinity then the value will not change from the default 0xffffffff.

这里的问题是位掩码是十六进制的。因此,如果你有 N 个 CPU,

N=$(grep -c processor /proc/cpuinfo)

启用所有 CPU 的所有 IRQ,如果你有 N 个 CPU,你可以

printf %x $((2**N-1)) | sudo tee /proc/irq/*/smp_affinity

内核 3.0 及更高版本有一个名为的文件smp_affinity_list。此文件采用逗号分隔的 CPU 或 CPU 范围列表。有效示例:0,,2,3,5-70-7上一个命令相当于:

echo 0-$((N-1)) | sudo tee /proc/irq/*/smp_affinity_list

答案3

但我希望看到关于亲和性配置为何不起作用的权威答案。令我担心的是,每个人似乎都认为这是可能的,但我做不到。

仅针对这个特定问题 - 我不知道 Xen 是否影响这个答案 -Input/output error当当前没有设备驱动程序安装针对该中断的处理程序时,您会收到消息。

例如,如果驱动程序在“105”上安装了处理程序,则会/proc/irq/105创建目录,smp_affinity其中包含 ,以及其他内容。您现在可以写入smp_affinity。如果您关闭设备,目录仍会保留,并带有smp_affinity,但您无法再写入它。打开设备(通过open,或request_irq驱动程序中最终调用的任何方法),您现在可以写入文件。仅在 RHEL/SL 6 上测试过。

如果您不知道设备当前是否打开,请检查目录。如果打开,它将包含设备名称。

相关内容