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

标签 concurrency connection client netty

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

最近,我开始对我的系统进行负载测试,但现在我遇到了 Netty 的一些可扩展性问题。我尝试 fork 尽可能多的并发 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)
在 java.lang.Thread.run(Thread.java:722)

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

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

你有什么提示吗?

最佳答案

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

clientBootStrap.setOption("connectTimeoutMillis", optimumTimout);

2) 通过在 Netty 服务器中设置 backlog 值,可以增加传入连接队列的大小,让客户端有更好的机会连接到服务器
serverBootStrap.setOption("backlog", 1000);

3)你说你的应用程序同时创建了很多连接,Client Boss线程may lag behind , 如果应用程序连接太快。

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

关于concurrency - 如何允许更多并发客户端与 Netty 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8442166/

相关文章:

python-2.7 - python中socket模块的 `listen(1)`方法中参数1是什么意思?

java.sql.SQLException : database is locked error

R postgres 连接到 RS-DBI 驱动程序中的远程测量错误

iOS 如何限制 ASIHTTPRequest 并发连接数?

java - 这是线程安全的吗?

java - 使用扩展 asynctask 的类来检查 Android Activity 中的互联网连接

javascript - 使用 jQuery 调整图像大小

node.js - 在 ubuntu 16.04 上安装 aerospike-node 客户端时出错

java - Java中的构造函数同步

基于可用 FREE cpu 的 Java 并发性