2012-05-12 10 views
0

私は、NATトラバーサルを行うためのおもちゃの例をプログラミングしています。広く使われているデスクトップアプリケーションがそのようなことをしているのに興味があり、wiresharkを使ってそのトラフィックを分析しようとしました。出力のいくつかの調査の後、私は、サーバ通知(例えば、 "xxxフォルダに追加された新しいファイル")が、長い間生き延びたHTTP接続を持つ何らかの種類のCometメカニズムを使って動作することを認識しました。しかし、私を最も驚かせたのは、トラフィックが少なくても(1分のHTTP GETと1分ごとの応答)、TCP接続は決して閉じられませんでした。私は、接続が少なくとも20分間は閉じられていないことを保証することができます。サーバーリソースを強制終了せずに長時間持続するTCP接続を作成するには?

私の理解では、長い時間の長いTCP接続を同時に開いていると、サーバーのリソース(主にメモリの面で)を素早く消費することになります。だから私の質問は、この種のアプリケーションが効率的にこのような膨大な数のTCPとHTTP接続を長期間に亘って同時に開くことができるのですか?彼らは特別な種類のサーバーを使用していますか?それとも、ハードウェアを追加して水平方向に拡大することだけですか?

私は運がない、答えを見つけようと多くのことを探そうとしました。おそらく私はかなり明白な何かを見逃しているでしょう。

+0

"長い時間の開いたTCP接続を同時に開くと、(主にメモリの点で)サーバーのリソースが急速に消費されます。あなたは何を考えているのですか? –

+0

おそらく私はそれを正しく説明しなかったでしょう。その接続が開かれている間、それが使用するリソースは、他の要求を処理するために使用することはできません。私の理解によれば、リクエストは速やかに処理され、リソースは自由になってより多くのリクエストを処理できます。私は、このような膨大な数の永続的な接続をこの種のアプリケーションが効率的に管理する方法を理解していません。つまり、盲目的にサーバーを追加する以外に何をしているのでしょうか? – joanlofe

+1

必ずしも多くのメモリが消費されるわけではありませんが、そのようなサーバプロセスでは、ファイル記述子にはかなり高い制限が必要です(accept()を呼び出すたびに新しいファイル記述子が返されるため) – Banaan

答えて

1

epoll(Linux)、kqueue(freebsd)、libev、およびlibeventをご覧ください。

epollのウィキペディアのページから: "見たファイル記述子の数が多い場所" '監視ファイル記述子'をTCPソケットに置き換えることができます。

関連する問題