CPU0被eth1中断吞噬

我有一个Ubuntu虚拟机,运行在基于Ubuntu的Xen XCP中。 它在nginx后面托pipe一个基于FCGI的自定义HTTP服务。

ab负载下, 第一个CPU内核已经饱和,剩下的内存不足。

/proc/interrupts我看到CPU0的中断数比其他任何内核都多。 他们大部分来自eth1

有什么我可以做的改善这个虚拟机的性能? 有没有一种平衡中断的方法?


血淋淋的细节:

 $ uname -a
 Linux MYHOST 2.6.38-15-virtual#59 -Ubuntu SMP Fri Apr 27 16:40:18 UTC 2012 i686 i686 i386 GNU / Linux

 $ lsb_release -a
没有LSB模块可用。
经销商ID:Ubuntu
说明:Ubuntu 11.04
发行date:11.04
代号:natty

 $ cat / proc / interrupts 
            CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7       
 283:113720624 0 0 0 0 0 0 0 xen-dyn-event eth1
 284:1 0 0 0 0 0 0 0 xen-dyn-event eth0
 285:2254 0 0 3873799 0 0 0 0 xen-dyn-event blkif
 286:23 0 0 0 0 0 0 0 xen-dyn-event hvc_console
 287:492 42 0 0 0 0 0 295324 xen-dyn-event xenbus
 288:0 0 0 0 0 0 0 222294 xen-percpu-ipi callfuncsingle7
 289:0 0 0 0 0 0 0 0 xen-percpu-virq debug7
 290:0 0 0 0 0 0 0 151302 xen-percpu-ipi callfunc7
 291:0 0 0 0 0 0 0 3236015 xen-percpu-ipi resched7
 292:0 0 0 0 0 0 0 60064 xen-percpu-ipi spinlock7
 293:0 0 0 0 0 0 0 12355510 xen-percpu-virq timer7
 294:0 0 0 0 0 0 803174 0 xen-percpu-ipi callfuncsingle6
 295:0 0 0 0 0 0 0 0 xen-percpu-virq debug6
 296:0 0 0 0 0 0 60027 0 xen-percpu-ipi callfunc6
 297:0 0 0 0 0 0 5374762 0 xen-percpu-ipi resched6
 298:0 0 0 0 0 0 64976 0 xen-percpu-ipi spinlock6
 299:0 0 0 0 0 0 15294870 0 xen-percpu-virq timer6
 300:0 0 0 0 0 264441 0 0 xen-percpu-ipi callfuncsingle5
 301:0 0 0 0 0 0 0 0 xen-percpu-virq debug5
 302:0 0 0 0 0 79324 0 0 xen-percpu-ipi callfunc5
 303:0 0 0 0 0 3468144 0 0 xen-percpu-ipi resched5
 304:0 0 0 0 0 66269 0 0 xen-percpu-ipi spinlock5
 305:0 0 0 0 0 12778464 0 0 xen-percpu-virq timer5
 306:0 0 0 0 844591 0 0 0 xen-percpu-ipi callfuncsingle4
 307:0 0 0 0 0 0 0 0 xen-percpu-virq debug4
 308:0 0 0 0 75293 0 0 0 xen-percpu-ipi callfunc4
 309:0 0 0 0 3482146 0 0 0 xen-percpu-ipi resched4
 310:0 0 0 0 79312 0 0 0 xen-percpu-ipi spinlock4
 311:0 0 0 0 21642424 0 0 0 xen-percpu-virq timer4
 312:0 0 0 449141 0 0 0 0 xen-percpu-ipi callfuncsingle3
 313:0 0 0 0 0 0 0 0 xen-percpu-virq debug3
 314:0 0 0 95405 0 0 0 0 xen-percpu-ipi callfunc3
 315:0 0 0 3802992 0 0 0 0 xen-percpu-ipi resched3
 316:0 0 0 76607 0 0 0 0 xen-percpu-ipi spinlock3
 317:0 0 0 16439729 0 0 0 0 xen-percpu-virq timer3
 318:0 0 876383 0 0 0 0 0 xen-percpu-ipi callfuncsingle2
 319:0 0 0 0 0 0 0 0 xen-percpu-virq debug2
 320:0 0 76416 0 0 0 0 0 xen-percpu-ipi callfunc2
 321:0 0 3422476 0 0 0 0 0 xen-percpu-ipi resched2
 322:0 0 69217 0 0 0 0 0 xen-percpu-ipi spinlock2
 323:0 0 10247182 0 0 0 0 0 xen-percpu-virq timer2
 324:0 393514 0 0 0 0 0 0 xen-percpu-ipi callfuncsingle1
 325:0 0 0 0 0 0 0 0 xen-percpu-virq debug1
 326:0 95773 0 0 0 0 0 0 xen-percpu-ipi callfunc1
 327:0 3551629 0 0 0 0 0 0 xen-percpu-ipi resched1
 328:0 77823 0 0 0 0 0 0 xen-percpu-ipi spinlock1
 329:0 13784021 0 0 0 0 0 0 xen-percpu-virq timer1
 330:730435 0 0 0 0 0 0 0 xen-percpu-ipi callfuncsingle0
 331:0 0 0 0 0 0 0 0 xen-percpu-virq debug0
 332:39649 0 0 0 0 0 0 0 xen-percpu-ipi callfunc0
 333:3607120 0 0 0 0 0 0 0 xen-percpu-ipi resched0
 334:348740 0 0 0 0 0 0 0 xen-percpu-ipi spinlock0
 335:89912004 0 0 0 0 0 0 0 xen-percpu-virq timer0
 NMI:0 0 0 0 0 0 0 0不可屏蔽的中断
 LOC:0 0 0 0 0 0 0 0本地定时器中断
 SPU:0 0 0 0 0 0 0 0寄生中断
 PMI:0 0 0 0 0 0 0 0性能监视中断
 IWI:0 0 0 0 0 0 0 0 IRQ工作中断
 RES:3607120 3551629 3422476 3802992 3482146 3468144 5374762 3236015重新调度中断
 CAL:770084 489287 952799 544546 919884 343765 863201 373596函数调用中断
 TLB:0 0 0 0 0 0 0 0 TLB射击
 TRM:0 0 0 0 0 0 0 0热事件中断
 THR:0 0 0 0 0 0 0 0阈值APIC中断
 MCE:0 0 0 0 0 0 0 0机器检查exception
 MCP:0 0 0 0 0 0 0 0机器检查民意测验
 ERR:0
 MIS:0

    查看/proc/irq/283目录。 有一个smp_affinity_list文件显示哪个CPU将得到283中断。 对于你这个文件可能包含“0”(和smp_affinity可能包含“1”)。

    您可以将CPU范围写入smp_affinity_list文件中:

     echo 0-7 | sudo tee /proc/irq/283/smp_affinity_list 

    或者你可以写一个位掩码,其中每个位对应一个CPU,以smp_affinity

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

    然而,已知irqbalance有自己的想法,每个中断应该具有什么亲和力,并且可能会恢复您的更新。 所以最好如果你只是完全卸载irqbalance。 或者至less停止它,并禁用它重新启动。

    如果即使没有不平衡,在重新启动之后你也得到奇怪的smp_affinity中断283,你将不得不手动更新一个启动脚本中的CPU亲和性。

    如果您拥有英特尔网卡的正确型号,则可以显着提高性能。

    引用第一段:

    多核处理器和最新的以太网适配器(包括82575,82576,82598和82599)允许通过将执行stream程分配给各个核心来优化TCP转发stream程。 默认情况下,Linux会自动将中断分配给处理器内核。 目前有两种方法可以自动分配中断,一个inkernel IRQ平衡器和用户空间中的IRQ平衡守护进程。 两者都提供了可能降低CPU使用率的权衡,但不能最大化IP转发速率。 通过手动将以太网适配器的队列固定到特定的处理器核心,可以获得最佳吞吐量。

    对于IP转发,发送/接收队列对应该使用相同的处理器核心,并减less不同核心之间的任何caching同步。 这可以通过将发送和接收中断分配给特定内核来执行。 从Linux内核2.6.27开始,可以在82575,82576,82598和82599上使用多个队列。此外,在扩展的消息传递中断(MSI-X)中启用了多个传输队列。 MSI-X支持更多的可用中断,允许更细粒度的控制,并将中断locking到特定的CPU。

    请参阅: 使用英特尔®82575/82576或82598/82599以太网控制器为处理器内核分配中断