我开始加载测试我的系统,但现在我遇到了Netty的一些可扩展性问题。我试图尽可能多地同时使用Netty客户端连接到Netty服务器。对于少量客户端(< 50),系统工作正常。但是,对于大量客户端(> 100),我发现客户端总是提示“ClosedChannelException”。 任何100以上的客户都将断开连接。 我的错误在哪里?我确信netty可以处理数以千计的连接。
我正在使用netty 4.0.23
这是我的bootstrap和新频道设置。
public void run() throws Exception {
int workerthreads = 10;
EventLoopGroup bossGroup = new NioEventLoopGroup(2);
EventLoopGroup workerGroup = new NioEventLoopGroup(workerthreads); //insert cashed sthread factory to constructor?
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.option(ChannelOption.SO_BACKLOG, 1000)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
//decrypt //checknum
ch.config().setRecvByteBufAllocator(new FixedRecvByteBufAllocator(2048));
//InboundDecryptor inbD = new InboundDecryptor();
//inbD.
ch.pipeline().addLast(new InboundDecryptor());
//ping control
ch.pipeline().addLast("idleStateHandler", new IdleStateHandler(Constants.getConnectTimeout(), 0, 0));
ch.pipeline().addLast("pingHandler", new PingOut());
//encrypt
ch.pipeline().addLast(new MessageOutboundEncryptor());
ch.pipeline().addLast(new ResponseHandler());
ch.pipeline().addLast("PackageHandler", new HandlePackets());
}
})
.option(ChannelOption.SO_BACKLOG, 1000)
.option(ChannelOption.SO_REUSEADDR, true)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000000);
// Bind and start to accept incoming connections.
ChannelFuture f = b.bind(port).sync();
boolean exit = false;
while (!exit) {
Scanner console = new Scanner(System.in);
String input;
input = console.nextLine();
if ("exit".equals(input)) {
exit = true;
}
}
f.channel().close();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
LOG.info("Server shuted down");
}
}
我在这里看到类似的问题: Other old question
但是没有一个推荐的解决方案没有帮助 我将backlog和连接超时设置为高值,我的测试软件每秒只创建两次新连接,这对于boss线程来说必须足够远。 但仍然只允许100个客户。