netty允许低并发连接

时间:2014-11-07 14:47:59

标签: java netty

我开始加载测试我的系统,但现在我遇到了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个客户。

0 个答案:

没有答案