2014-09-04 52 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之間。