2 つの C++ プロセスがあり、各プロセスに 1 つのスレッドがあります。スレッドは、32 の着信 TCP 接続からのネットワーク トラフィック (Diameter) を処理し、それを解析して、32 の発信 TCP 接続を介して分割メッセージを転送します。この C++ プロセスを DiameterFE と呼びましょう。
実行中の DiameterFE プロセスが 1 つだけの場合、1 秒あたり 70,000 メッセージを処理できます。
2 つの DiameterFE プロセスが実行されている場合、それぞれ 35,000 メッセージ/秒を処理できるため、合計で同じ 70,000 メッセージ/秒になります。
なぜ彼らはスケーリングしないのですか?ボトルネックとは?
詳細: 各 Diameter フロント エンド プロセスには 32 のクライアント (カモメ) と 32 のサーバ (カモメ) があり、別々のホストで実行されます。
これら 2 つのプロセス用に専用ホストが提供されます - 2 つの E5-2670 @ 2.60GHz CPU x 8 コア/ソケット x 2 HW スレッド/コア = 合計 32 スレッド。
10 ギガビット/秒のネットワーク。平均直径メッセージ サイズは 700 バイトです。
Cpu0 だけがネットワーク トラフィックを処理しているようです - 58.7%si. 異なるネットワーク キューを異なる CPU に明示的に構成する必要がありますか?
最初のプロセス (PID=7615) は 89.0 % の CPU を使用し、Cpu0 で実行されています。
2 番目のプロセス (PID=59349) は 70.8 % の CPU を使用し、Cpu8 で実行されています。
一方、Cpu0 は 95.2% = 9.7%us + 26.8%sy + 58.7%si で
ロードされますが、Cpu8 は 70.3% = 14.8%us + 55.5%sy でしかロードされません。
2番目のプロセスでも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
...