首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >慢速网络性能

慢速网络性能
EN

Stack Overflow用户
提问于 2017-01-17 12:32:55
回答 1查看 2.4K关注 0票数 4

我正在使用netty从服务器下载大型文件。在使用starts运行性能测试时,我发现我的服务器提供了非常高的吞吐量,直到150个并发用户,但是当并发用户数量增加时,它就开始下降,在500个并发用户上几乎减半。

NettyServer -

代码语言:javascript
复制
ServerBootstrap b = new ServerBootstrap();
    EpollEventLoopGroup bossGroup = new EpollEventLoopGroup();
    EpollEventLoopGroup workerGroup = new EpollEventLoopGroup();
  try {
        b.group(bossGroup, workerGroup).channel(EpollServerSocketChannel.class).handler(new LoggingHandler(LogLevel.DEBUG)).childHandler(new FileServerInitializer());
        Channel ch = b.bind(port).sync().channel();
        ch.closeFuture().sync();

    } finally {
        bossGroup.shutdownGracefully();
        workerGroup.shutdownGracefully();
        FileServerHandler.threadPool.shutdownNow();
    }

FileServerInitializer -

代码语言:javascript
复制
ChannelPipeline pipeline = ch.pipeline();
    pipeline.addLast("decoder", new HttpRequestDecoder());
    pipeline.addLast("aggregator", new HttpObjectAggregator(65536));
    pipeline.addLast("encoder", new HttpResponseEncoder());
    pipeline.addLast("chunkedWriter", new ChunkedWriteHandler());
    pipeline.addLast("handler", (ChannelHandler) new FileServerHandler());
}

FileServerHandler -

代码语言:javascript
复制
    RandomAccessFile raf;
    try {
        raf = new RandomAccessFile(file, "r");
    } catch (FileNotFoundException ignore) {
        sendError(ctx, HttpResponseStatus.NOT_FOUND);
        return;
    }
    response = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.OK);
    response.headers().set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileNameType);
    response.headers().set(HttpHeaders.CONTENT_LENGTH, String.valueOf(size));

    ctx.write(response);
    ChannelFuture sendFileFuture;
    ChannelFuture lastContentFuture;
    sendFileFuture = ctx.writeAndFlush(new HttpChunkedInput(new ChunkedFile(raf, 0, size, 8192)),ctx.newProgressivePromise());
    lastContentFuture = sendFileFuture; 
    sendFileFuture.addListener(new ChannelProgressiveFutureListener() {

        public void operationProgressed(ChannelProgressiveFuture future, long progress, long total) {
            if (total < 0) {            
                System.out.println(future.channel() + " Transfer progress: " + progress);
            }else {
                System.out.println(future.channel() + " Transfer progress: " + progress + " / " + total);
            }
        }

        public void operationComplete(ChannelProgressiveFuture future) {
            System.out.println(future.channel() + " Transfer complete.");
        }
    });

    lastContentFuture.addListener(ChannelFutureListener.CLOSE);

有人能告诉我为什么会这样吗?

EN

回答 1

Stack Overflow用户

发布于 2017-01-18 18:30:14

你也可以试着:

  1. 例如,在网络端更改子属性(获取自己的正确值) bootstrap.channel(NioServerSocketChannel.class);bootstrap.group(groupBoss,groupWorker);bootstrap.option(ChannelOption.TCP_NODELAY,true);bootstrap.option(ChannelOption.SO_REUSEADDR,真);bootstrap.option(ChannelOption.SO_LINGER,0);bootstrap.childOption(ChannelOption.SO_REUSEADDR,true;bootstrap.childOption(ChannelOption.SO_REUSEADDR,true);bootstrap.childOption(ChannelOption.SO_KEEPALIVE,true);bootstrap.childOption(ChannelOption.SO_LINGER,0;bootstrap.childOption(ChannelOption.CONNECT_TIMEOUT_MILLIS,超时);bootstrap.childOption(ChannelOption.SO_RCVBUF,1048576;bootstrap.childOption(ChannelOption.SO_SNDBUF,1048576);bootstrap.childOption(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK,10*65536;bootstrap.childOption(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK,2*65536;bootstrap.childOption(ChannelOption.ALLOCATOR,PooledByteBufAllocator.DEFAULT);
  2. 调整BOSS和WORKER端的线程数量(默认为2N+1,其中N是Boss的核心编号,如果我回忆正确的话) 我通常为Boss设置2N+1,为worker设置10N+1 (将Worker视为异步工作人员,这意味着这并不是对并发客户端的真正限制,而是对“真实的”并发客户端的限制,这意味着它们实际上做了一些事情)。在Linux上要小心,相应地增加文件描述符的限制。
  3. 更精确地指定工作线程级别。

当然也会看到其他的建议

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41697296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档