我有一个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以太网控制器为处理器内核分配中断