如何通过Netty允许更多的并发客户端连接



首先,感谢所有Netty贡献者提供了这个伟大的库。我已经愉快地使用了几个星期了。

最近,我开始对我的系统进行负载测试,但是现在我遇到了Netty的一些可伸缩性问题。我尝试同时分叉尽可能多的Netty客户端来连接到Netty服务器。对于少数客户端(50个),系统工作得很好。然而,对于大量的客户端(>100),我发现客户端总是提示"closechannelexception":

java.nio.channels.ClosedChannelExceptionorg.jboss.netty.channel.socket.nio.NioClientSocketPipelineSink operationcomplete 1.美元(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.美元运行(DeadLockProofWorker.java: 44)java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java: 1110)java.util.concurrent.ThreadPoolExecutor Worker.run美元(ThreadPoolExecutor.java: 603)java.lang.Thread.run (Thread.java: 722)

我想知道如何使Netty支持更多的同时客户端连接,如10K。我用的是最新版本的Netty。下面是测试场景:

每个客户端发送一个四个字母的字符串给服务器,服务器处理程序在接收到这个字符串后什么也不做。每个服务器和客户端都运行在一台具有8核和16GB内存的高性能机器上。两台机器通过千兆字节的网络连接起来。

你有什么提示吗?

1)您可以在客户端引导中调整connectTimeout以确保没有网络/服务器问题

clientBootStrap.setOption("connectTimeoutMillis", optimumTimout);

2)通过设置Netty服务器中的积压值,可以增加传入连接队列的大小,因此客户端将有更好的机会连接到服务器

serverBootStrap.setOption("backlog", 1000);

3)你说你的应用程序同时创建了许多连接,如果应用程序连接得太快,Client Boss线程可能会滞后。

Netty 3.2.7 Final允许在NioClientSocketChannelFactory构造函数中设置多个Client Boss线程以避免此问题。

最新更新