Как разрешить более одновременные клиентские соединения с Netty? - PullRequest
7 голосов
/ 09 декабря 2011

Во-первых, спасибо всем авторам Netty за отличную библиотеку. Я счастливо использовал это в течение нескольких недель.

Недавно я начал загружать тесты своей системы, но теперь у меня возникают проблемы с масштабируемостью в Netty. Я попытался подключить как можно больше одновременных клиентов Netty к серверу Netty. Для небольшого количества клиентов (<50) система просто отлично работает. Однако, для большого количества клиентов (> 100), я нахожу, что клиентская сторона всегда запрашивает «ClosedChannelException»:

java.nio.channels.ClosedChannelException в org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink $ 1.operationComplete (NioClientSocketPipelineSink.java:157) в org.jboss.netty.channel.DefaultChannelFuture.notifyListener (DefaultChannelFuture.java:381) в org.jboss.netty.channel.DefaultChannelFuture.notifyListeners (DefaultChannelFuture.java:367) в org.jboss.netty.channel.DefaultChannelFuture.setSuccess (DefaultChannelFuture.java:316) в org.jboss.netty.channel.AbstractChannel $ ChannelCloseFuture.setClosed (AbstractChannel.java:351) на org.jboss.netty.channel.AbstractChannel.setClosed (AbstractChannel.java:188) в org.jboss.netty.channel.socket.nio.NioSocketChannel.setClosed (NioSocketChannel.java:146) на org.jboss.netty.channel.socket.nio.NioWorker.close (NioWorker.java:592) в org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink $ Boss.close (NioClientSocketPipelineSink.java:415) в org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink $ Boss.processConnectTimeout (NioClientSocketPipelineSink.java:379) в org.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink $ Boss.run (NioClientSocketPipelineSink.java:299) в org.jboss.netty.util.ThreadRenamingRunnable.run (ThreadRenamingRunnable.java:108) на org.jboss.netty.util.internal.DeadLockProofWorker $ 1.run (DeadLockProofWorker.java:44) в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:603) at java.lang.Thread.run (Thread.java:722)

Мне интересно, как заставить Netty поддерживать больше одновременных клиентских подключений, таких как 10K. Я использую новейшую версию Netty. Ниже приведен сценарий тестирования:

Каждый клиент отправляет четырехбуквенную строку на сервер, и обработчик сервера ничего не делает при получении строки. Каждый сервер и клиенты работают на высокопроизводительной машине с 8-ядерным процессором и 16 ГБ памяти. Эти две машины связаны сетью Gigabyte.

У вас есть какие-нибудь намеки?

1 Ответ

6 голосов
/ 10 декабря 2011

1) Вы можете настроить connectTimeout в загрузчике клиента, чтобы убедиться, что нет проблем с сетью / сервером

clientBootStrap.setOption("connectTimeoutMillis", optimumTimout);

2) Установив значение backlog на сервере Netty, вы можете увеличить очередь на размер входящего соединения, чтобы у клиентов была больше шансов на соединение с сервером

serverBootStrap.setOption("backlog", 1000);

3) Вы сказали, что ваше приложение создает много соединений одновременно, поток Client Boss может отставать от , если приложение подключается слишком быстро.

Netty 3.2.7 Final позволяет установить более одного потока Client Boss в конструкторе NioClientSocketChannelFactory, чтобы избежать этой проблемы.

...