5

メッセージのストリームを取得し、各メッセージをクライアントに配信するカスタム メッセージ サーバーを Java で構築しました (1:1、接続されていない場合はメッセージをドロップする - 非常に簡単です)。Win7x64 および Java 7 で Tomcat 7 を実行しており、NIO コネクタ (Comet サーブレットを実装) を使用しています。それはうまく機能しますが、私は現在、その獣のスケーリングを検討しており、現在、接続されている各クライアントに約 85kb の RAM が割り当てられていることを確認しています。10.000 クライアント @ 900MB 未満で、直線的にスケーリングします。(私はまだ接続を保持する以外に何もしていません)それは私の意見ではかなり多いので、TomcatまたはJavaがNIO実装でより多くのメモリを節約できるようにするための調整があるかどうか疑問に思っています。これまでに試したすべての Tomcat 設定は、これにまったく影響しませんでした。

ソケット接続に関してJavaまたはTomcatをメモリダイエットに入れる方法を経験した人はいますか?

更新: ソケット バッファーとその他の tomcat 内部をトリミングすることで、接続あたり 70kb 未満になりました。これがスループットにどのように影響するかはわかりません。32ビット/ 64ビットLinuxでも試してみましたが、同じ結果でした。

4

1 に答える 1

2

かなりの調査と試行錯誤の結果、Tomcat では妥当な量のメモリで大量の同時接続を処理することは不可能であるという結論に達しました。(ここで間違っていることが証明されれば幸いです)

しかし、救世主がいます:

Netty: http://www.jboss.org/netty/downloads

これは、Java の新しい NIO アーキテクチャー上に構築された Java IO フレームワークであり、非常にうまく設計および作成されているようです。いくつかの軽量モジュールを積み重ねてミニ Web サーバーを作成したり、TCP 接続を自分で非同期に処理したりすることができます。

EC2 で負荷テストを実行したところ、わずか 1.5 GB の RAM で 700 万接続という驚くべき結果が得られました。(Tomcat テストと同様に、接続を保存するだけでした。したがって、実際のアプリはもちろんもう少し多くのメモリを消費しますが、200 バイト/接続の「オーバーヘッド」は何もありません!) Java VM を制限したため、そこで停止しただけです。 1.5GB までなら、C10M テストは簡単に実行できると確信しています。

Netty と Java VM の人たちに大きな称賛を!私が感銘を受けた。

于 2012-04-22T18:16:09.960 に答える