39

野生のインターネットからの 500 ~ 1000 のアクティブな接続を処理する必要がある TCP サービスの前に配置する TCP プロキシを開発しています。

プロキシはサービスと同じマシンで実行されており、ほとんど透過的です。サービスはほとんどの場合、プロキシを認識しません。唯一の例外は、クライアントの実際のリモート IP アドレスの通知です。

これは、インバウンドのオープン TCP ソケットごとに、サーバー上にさらに 2 つのソケットが存在することを意味します。プロキシのペアの 2 番目と、プロキシの背後にある実際のサービスの 1 つです。

2 つのプロキシ ソケットの送信および受信ウィンドウ サイズは 1024 バイトに設定されています。

これに対するパフォーマンスへの影響は何ですか?この構成はどれくらい遅いですか? 名前付きパイプ (またはその他の IPC メカニズム) を使用するようにサービスを変更する必要がありますか? それとも、ほとんどの場合、localhost TCP ソケットが効率的な IPC になりますか?

2 つのアプリのマージはオプションではありません。現在、2 つのプロセス構成に固執しています。

EDIT:同じハードウェア上に2つの別々のプロセスを持つ理由は、100%経済的です。私たちはサーバーを 1 つしか持っておらず、それ以上のサーバーを取得する予定はありません (お金はありません)。

TCP サービスは、Visual Basic 6 のレガシ ソフトウェアであり、私たちの予想を超えて成長しました。プロキシは C++ です。VB6 コードを書き直して最新のプログラミング環境に移行するための時間、お金、人材がありません。

プロキシは、サービスの特定のパフォーマンスの問題、つまり時々発生するDDoS 攻撃を軽減するための試みです。

プロキシはオープン ソースです。プロジェクトのソース コードは次のとおりです

4

6 に答える 6

34

それは同じです(または少なくとも測定可能な違いはありません)。Winsock は、同じホスト上のソケットと通信しているかどうかを認識できるほどスマートであり、その場合、IP の下のほとんどすべてを短絡し、データをバッファーからバッファーに直接コピーします。名前付きパイプとソケットに関して言えば、将来、異なるマシンと通信できるようにする必要がある場合は、ソケットを選択してください。それを行う必要がないことがわかっている場合は、開発者が最も慣れているか、最も使い慣れているものを選択してください。

于 2012-06-04T01:03:39.353 に答える
30

後でこれを読む人のために、元の質問に答えるいくつかの調査結果を追加したいと思います.

私たちが開発しているユーティリティには、同じ呼び出しで名前付きパイプまたは TCP を使用できるネットワーク クラスがあります。

以下は、テスト システムでの典型的なループ バック ファイル転送です。

TCP/IP 転送時間: 2.5 秒
名前付きパイプの転送時間: 3.1 秒

ここで、マシンの外に出て、ネットワーク上のリモート コンピューターに接続すると、名前付きパイプのパフォーマンスが大幅に低下します。

TCP/IP 転送時間: 12 秒
名前付きパイプの転送時間: 2.5 分 (はい数分!)

これは 1 つのシステム (Windows 7) に過ぎないことは理解していますが、これは名前付きパイプがいかに遅いかを示す良い指標だと思います...そして、TCP が最適なようです。

于 2012-06-27T15:33:18.120 に答える
2

http://msdn.microsoft.com/en-us/library/aa178138(v=sql.80).aspx

要約させてください。パフォーマンスが心配な場合は、TCP/IP を使用してください。しかし、非常に高速なネットワークを使用していて、パフォーマンスについて心配していない場合、名前付きパイプは、コードを節約できるという点で「きちんとした」ものになります。

言うまでもなく、TCP に固執する場合は、スケーリングが可能であり、時が来れば負荷分散さえも行うことができます。

乾杯、

于 2012-06-03T18:25:42.963 に答える
1

あなたが説明したシナリオでは、ローカル TCP 接続がボトルネックになる可能性はほとんどありません。もちろん、いくらかのオーバーヘッドが発生しますが、CPU がすでに熱くなっていない限り、これは無視できるはずです。

推測では、サーバーの CPU 使用率が通常 50% 程度を下回っている場合 (プロキシが配置されている場合)、ローカル TCP 接続に関連するオーバーヘッドを最小限に抑えることを心配する必要はありません。

CPU 使用率が定期的に 80% を超えている場合は、プロファイリングを行う必要があります。まず、プロキシが配置されている場合とそうでない場合の CPU 負荷 (または、意味のある測定ができる場合はパフォーマンス) を比較することから始めます。プロキシが複雑な処理を行っていない限り、追加の TCP 接続に関連するオーバーヘッドは、おそらくプロキシによって導入される総オーバーヘッドのかなりの部分になるため、少なくとも 1 桁の見積もりが得られるはずです。 d より効率的な形式の IPC を使用して利益を得る。

于 2012-06-04T00:48:31.507 に答える
0

同じマシンにプロキシを配置する理由は何ですか?

ともかく:

IPC、TCP/IP、名前付きパイプにはいくつかの方法があり、速度と複雑さは同等です。拡張性が高く、オーバーヘッドがほとんどないものが本当に必要な場合は、共有メモリを使用してください。ポインタを進めるためのロック フリー アルゴリズムと組み合わせて使用​​するのが最適です (または、リーダー (プロキシ/サービス) とライター (サービス/プロキシ) ごとに 1 つのバッファを使用します)。

于 2012-06-03T18:26:23.920 に答える