0

私は Windows 2008 で単純で小さなサーバー アプリケーションを作成しました。このアプリケーションは、接続を受け入れるだけで他には何もしません。ソケット呼び出しのメモリ フットプリントの評価を行っています。各接続 (accept() の後) が少なくとも 2.5 KB のメモリを消費することがわかりました。興味深いことに、メモリは、accept() 呼び出しを持つプロセスによって消費されませんが、OS プロセスによって消費されます。接続ごとにOS内でデータ構造が作成されているためだと思います。

ここで、2 つの重要な質問があります。

このメモリ フットプリントを削減する方法はありますか (パラメータ、構成などを変更することにより)。はいの場合、どのように?(サーバーが数百万の接続を受け入れるように計画している場合、接続ごとに 2K は多すぎるため)

サーバーが何百万もの接続を受け入れることを意図している場合、Windows 2008 を使用することをお勧めしますか? または、他のOSに切り替える必要がありますか?

私に助言してください。

4

2 に答える 2

1

ほとんどの場合、2.5K はソケット バッファにあります。setsockopt SO_RECVBUF および SO_SNDBUF 呼び出しでサイズを減らすことができます。他のメモリが使用されますが、これらを設定するとメモリ フットプリントが削減されます。

これは、http サーバーなどが一度に何千もの同時接続に拡張できる方法です。そうしないと、メモリがかなり速く不足する可能性があります。

詳細については、このリンクをご覧ください: 100 万の同時 TCP 接続を保持する方法は?

あなたの質問は本当にstackoverflow.comにあるはずです。

于 2012-12-18T03:08:37.480 に答える
0
  1. いいえ。受信したパケットが正しく処理されるように、接続構造はカーネルによって作成および追跡される必要があります。ウィンドウ サイズ、パス MTU、その他あらゆる種類のものを保存する必要があります。最終的には受信バッファなどが必要になります。

  2. 特定のアプリケーション (これらすべての接続が実際に何をしているのか) について詳しく知らずに言うのは難しいです。しかし、200,000 の現在の接続を行うことは非常に困難であり、その特定の問題領域に精通した人が必要です。

于 2012-12-18T02:37:14.777 に答える