2012-04-13 7 views
5

私はJavaでカスタムメッセージサーバーを構築しました。これはメッセージのストリームを受け取り、各メッセージをクライアントに配信します(接続されていない場合は1:1メッセージをドロップします。 Win7x64 & Java 7でTomcat 7を実行していて、NIOコネクタを使用しています(Cometサーブレットを実装しています)。 それは素晴らしいですが、私は今、その獣をスケーリングしようとしており、現在接続されているクライアントごとに約85kbのRAMが割り当てられています。 10.000クライアント@ 900MB、リニアスケーリング(私はまだ何もしていませんが、まだコネクションを持っていません)それは私の意見ではかなり多いので、TomcatやJavaにNIO implでより多くのメモリを節約するための調整があるかどうか疑問に思っています。私がこれまでに試したTomcatの設定は、これにまったく影響しませんでした。Tomcatの「接続ごとの」メモリフットプリントを最小限にする

誰かがJavaやTomcatをソケット接続に関するメモリダイエットにどのように配慮した経験がありますか?

更新: ソケットバッファと他のいくつかのTomcat内部をトリミングすることで、70kb/connection以下になりました。これがスループットにどのように影響するかは不明です。私は32ビット/ 64ビットLinuxでも同じ結果を試しました。

+0

どのようにクライアントあたり85kbを測定しましたか? – dash1e

+0

小さな負荷テストを行い、10.000のクライアントを接続しました。サーバーコードでは、100クライアントごとにSystem.gc()を実行し、Runtime.totalMemory() - Runtime.freeMemory()をコンソールに出力しました。 – Daniel

+0

こんにちは。あなたは最高のTomcat/JVM設定を共有できますか?また、NIOコネクタを使用しましたか? 10倍 – JRun

答えて

1

非常に研究して遊んだ後、私は結論として、妥当な量のメモリで膨大な数の同時接続を処理することはTomcatでは不可能であるという結論に達しました。

(私はまだところで、ここで間違って証明させていただき)しかし、救世主があります:

ネッティー:http://www.jboss.org/netty/downloads

それはJavaの新しいNIOアーキテクチャ上に構築しているようだJavaのIOフレームワークです非常によく設計され、書かれています。いくつかの軽量モジュールをスタックして、ミニWebサーバーを作成するか、またはTCP接続を非同期で簡単に処理できます。

私はEC2で負荷テストを実行し、驚異的な7百万接続@1.5GBのRAMにしました! (Tomcatテストのように、私は接続を保存しただけなので、実際のアプリケーションはもちろんmemをもう少し消費しますが、200バイト/接続の "オーバーヘッド"は何もありません!)そして、私はJava VM 1.5GBまで、私はC10Mテストが簡単にできると確信しています。

NettyとJava VMのユーザーに大きな賞賛!私が感銘を受けた。

関連する問題