1

新しい Java ソケット NIO について少し調べてみました。多くのクライアント(約1000)からの接続を受け入れ、それらから受信したデータを処理するシミュレートされたサーバーを構築するためにMINAを使用しています。また、約 300 のクライアント接続を作成し、スレッドを使用してサーバーにデータを送信するクライアント シミュレーターもセットアップしました。その結果、接続の一部がサーバーによって中止されます。コードは以下です

 try {
  listener = new NioSocketAcceptor(ioThread);

  listener.getFilterChain().addLast("codec", new ProtocolCodecFilter(new MessageCodecFactory()));
  listener.getFilterChain().addLast("thread", new ExecutorFilter(100, 150));
  listener.setHandler(new IncomingMessageHandler(serverMessageHandler));

  listener.bind(new InetSocketAddress(PORT));
 }
 catch (IOException ioe) {
 }

そして、ここにハンドラーがあります。セッションは、クライアントからの各接続の私のクラスです

 @Override
 public void sessionCreated(IoSession session) throws Exception {
  new Session(session.getRemoteAddress(), handler, session);
  super.sessionCreated(session);
 }

 @Override
 public void messageReceived(IoSession session, Object message)
   throws Exception {

  Message m = Message.wrap((MessagePOJO)message);
  if (m != null) {
   Session s = SessionManager.instance.get(session.getRemoteAddress());
   if (s != null) {
    s.submit(m);
    ArmyServer.instance.tpe.submit(s);
   }
  }

  super.messageReceived(session, message);
 }

 @Override
 public void sessionClosed(IoSession session) throws Exception {
  Session s = SessionManager.instance.get(session.getRemoteAddress());
  if (s != null)
   s.disconnect();
  super.sessionClosed(session);
 }

そしてクライアントシミュレーター、SIZE ~300 - 400

     for (int i = 0; i < SIZE; i++) {
  clients[i] = new Client(i);
  pool[i] = new Thread(clients[i]);
  pool[i].start();
 }

問題は、Mina が一度にいくつの接続を受け入れることができるかということです。または、私のコードに何か問題がありますか?

4

2 に答える 2

3

サーバーに過負荷をかけている可能性があります。OS と CPU の制限により、一度に多くのリクエストを受け入れることしかできません。ServerSocket のリッスン キューの長さより多くの保留中の要求があると、接続は拒否されます。

リッスン キューの長さ ( の backlog パラメータServerSocket.bind()) を増やすか、クライアントの for ループに少量の sleep() を追加してみてください。

Mina の詳細はわかりませんが、メッセージを処理するスレッドの数に加えて、1 つ以上のスレッドを受け入れるようにしたい場合もあります。

于 2010-12-10T14:34:41.133 に答える
2

私が見る限り、セレクターが選択できるチャンネルの数に関する文書化された制限はありません。通常、実装制限Integer.MAX_VALUEまたは類似のものがあります。この特定のケースでは、制限は のSelectorProvider実装方法にあると思いますが、ほとんどの JVM でネイティブであるに違いありません...

関連する質問:

関連記事:

于 2010-11-22T08:37:33.687 に答える