如何允许与Netty更多的并发客户端连接?

时间:2011-12-09 07:06:14

标签: concurrency connection client netty

首先,感谢所有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)         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)         at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:603)         在java.lang.Thread.run(Thread.java:722)

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

每个客户端向服务器发送一个四字母字符串,服务器处理程序在收到字符串后不执行任何操作。每个服务器和客户端都运行在具有八核和16GB内存的高性能计算机上。这两台机器通过技嘉网络连接。

你有任何提示吗?

1 个答案:

答案 0 :(得分:6)

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

clientBootStrap.setOption("connectTimeoutMillis", optimumTimout);

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

serverBootStrap.setOption("backlog", 1000);

3)您已经说过,如果应用程序连接速度太快,您的应用程序会同时创建多个连接,Client Boss线程may lag behind

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