2014-09-04 51 views
0


有两个C++进程,每个进程中有一个线程。该线程处理来自32个传入TCP连接的网络流量(Diameter),解析它并通过32个传出TCP连接转发拆分消息。我们把这个C++过程称为DiameterFE。
如果只有一个DiameterFE进程正在运行,它可以处理70 000条消息/秒。
如果两个DiameterFE进程正在运行,它们每个可以处理35 000条消息/秒,所以总共有70 000条消息/秒。
他们为什么不扩展?什么是瓶颈?
运行多个进程不会缩放

详细信息: 每个Diameter前端进程有32个客户端(海鸥)和32个服务器(海鸥),运行在不同的主机上。
为这两个进程提供了一个专用主​​机 - 2个E5-2670 @ 2.60GHz CPU×8个内核/插槽×2个HW线程/内核=总共32个线程。
10 GBit/sec网络。 平均直径消息大小为700字节。

它看起来像只有Cpu0处理网络流量 - 58.7%si。我是否必须为不同的CPU显式配置不同的网络队列?
第一个进程(PID = 7615)占用89.0%的CPU,它在Cpu0上运行。
第二个进程(PID = 59349)占用70.8%的CPU,它在Cpu8上运行。
在另一方面,CPU0装载在:95.2%= 9.7%,美国+ 26.8%SY + 58.7%SI,
而CPU8在70.3%= 14.8%,仅装载我们+ 55.5%SY

看起来,Cpu0也在为第二个进程做这项工作。 softirq非常高,只有Cpu0 = 58.7%。为什么?

这里是“1”键顶部按下输出:

top - 15:31:55 up 3 days, 9:28, 5 users, load average: 0.08, 0.20, 0.47 
Tasks: 973 total, 3 running, 970 sleeping, 0 stopped, 0 zombie 
Cpu0 : 9.7%us, 26.8%sy, 0.0%ni, 4.8%id, 0.0%wa, 0.0%hi, 58.7%si, 0.0%st 
... 
Cpu8 : 14.8%us, 55.5%sy, 0.0%ni, 29.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
... 
Cpu31 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
Mem: 396762772k total, 5471576k used, 391291196k free, 354920k buffers 
Swap: 1048568k total,  0k used, 1048568k free, 2164532k cached 

    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND          
7615 test1  20 0 18720 2120 1388 R 89.0 0.0 52:35.76 diameterfe 
59349 test1  20 0 18712 2112 1388 R 70.8 0.0 121:02.37 diameterfe          
    610 root  20 0 36080 1364 1112 S 2.6 0.0 126:45.58 plymouthd          
3064 root  20 0 10960 788 432 S 0.3 0.0 2:13.35 irqbalance          
16891 root  20 0 15700 2076 1004 R 0.3 0.0 0:01.09 top          
    1 root  20 0 19364 1540 1232 S 0.0 0.0 0:05.20 init          
... 
+0

此问题的解决方法是将内核升级到2.6.32-431.20.3.el6.x86_64。
之后,网络中断和消息队列分布在不同的CPU之间。 – Neighbour 2015-01-16 16:49:11

回答

0

这个问题的修复是在内核升级到2.6.32-431.20.3.el6.x86_64。
之后,网络中断和消息队列分布在不同的CPU之间。