0

動作は次のとおりです。たとえば、200 個のソケットを持つ 1 つのサーバー ワーカーは、1 秒あたり 100K のエコーを処理します。同じポートで別のサーバー ワーカーを起動すると (各ワーカーのソケット数が同じか、2 倍少なくても問題ありません)、最初のワーカーのパフォーマンスがすぐに約 50% に低下し、マシンごとの全体的なパフォーマンスがわずかに向上します (各ワーカーがサービスを提供します)。 1 秒あたり約 50K のエコー)。

したがって、6 コア マシンのパフォーマンスは、1 コア マシンの場合とほぼ同じです。

各ワーカーに独立した IOCP ポートを 1 つ持つ (CreateIoCompletionPort で NumberOfConcurrentThreads を 1 に指定する)、すべてのワーカーに 1 つの共有 IOCP ポートを試す (NumberOfConcurrentThreads はワーカーの数に等しい) など、さまざまなアプローチを試しましたが、パフォーマンスは同じです。私のワーカーはデータを共有しないため、ロックなどはありません。

Windows カーネル ネットワークのスケーラビリティの問題ではなく、何かが欠けていることを願っています。Windows 7 Enterprise x64 を使用しています。

もちろん、パフォーマンスはほぼ直線的にスケーリングされることが期待されていました。

1 台のマシン上の複数のコアに対する IOCP の実用的なスケーラビリティについて知っている人はいますか? アクティブなソケットの数が増えると、どのような状況が予想されますか?

ありがとうございました!

4

1 に答える 1

0

非 NUMA システムの通常のアプローチは、すべての接続に 1 つの IOCP を使用し、IOCP を処理する一連のスレッド (通常はサイズを調整可能) を使用することです。

その後、CPU の数に基づいてスレッドの数を調整し、スレッドによって実行される作業のいずれかが本質的にブロックされているかどうかを調整できます。

共有リソースの競合がスケーラビリティに影響を与える時点で、すべての接続がアクセスする必要がある共有リソースがない限り、パフォーマンスは適切にスケーリングされます。

無料の IOCP コードをいくつかここで入手できます。また、ここで数千の同時接続を実行できる単純な複数クライアント テストも用意しています。

NUMA システムの場合、理想的には、ローカル ノードへのメモリ アクセスを維持するために NUMA ノードごとに 1 つの IOCP、スレッド プール、およびバッファ アロケータを使用する必要があるため、状況は少し複雑になる可能性があります。

于 2012-04-11T07:48:22.337 に答える