【问题标题】:Is Netty Suitable For Long Running High TPS ClientsNetty 是否适合长时间运行的高 TPS 客户端
【发布时间】:2020-07-20 00:10:24
【问题描述】:

我已经尝试使用几个不同的库来构建通过 TCP 提供市场数据的服务器,Netty.io 就是其中一个候选者。本质上,我已经构建了一个小型 POC,并且在 64K TPS 等高注入率下遇到了一些性能问题。它似乎在 32K TPS 下运行良好,但在 64K TPS 以上时跌落悬崖并有效地停了下来。

以下时序图显示了服务器在 64K TPS 时的消息 IN 和 OUT。正如您在高注入率下看到的那样,它无处不在。

这是 32K TPS 的类似图表

代码很简单。我使用客户端的请求,将其提交给市场数据服务,该服务通过我拥有的 RXJava 管道将消息流式传输。消息被编码为二进制响应并通过 TCP 发送回客户端。我试图弄清楚我需要从哪里开始寻找。我确实知道瓶颈在编码方面非常重要,因为进入服务器的消息数量一开始就很高。每次收到消息时我都会刷新频道,所以我不确定这是否是导致它的原因。任何指导表示赞赏。

ServerBootstrap serverBootstrap = new ServerBootstrap();
    serverBootstrap
        .group(parentGroup, workerGroup)
        .channel(NioServerSocketChannel.class)
        .localAddress(port)
        .childOption(ChannelOption.SO_SNDBUF, 16777216)
        .childOption(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(16777216,33554432))
        .childHandler(new ChannelInitializer<SocketChannel>() {
            @Override
            protected void initChannel(SocketChannel socketChannel) throws Exception {
                //Build Pipeline to decode, process messages and encode response
                socketChannel.pipeline()
                    .addLast(
                        new FlushConsolidationHandler(1000, true),
                        createMessageFrameBuilder(),
                        new InboundMessageDecoder<>(),
                        new MarketDataReqResponseHandler<>(),
                        new MessageEncoder()
                    );
            }
        });

【问题讨论】:

    标签: netty


    【解决方案1】:

    您很可能应该批量处理刷新,因为flush() 很昂贵。您可以做的一件事是将FlushConsolidationHandler 添加到管道中。这将确保在安全的情况下将刷新合并在一起,从而最大限度地减少系统调用。

    【讨论】:

    • 值得一提的是,我的市场数据回调在 ChannelPipeline 上调用了writeAndFlush。是否有必要将数据发送到编码器,因为它还在通道上执行刷新操作?
    • 我需要查看您的代码才能更好地了解发生了什么。此外,您应该添加一个分析器并查看时间花费在哪里
    • 我有一些跟踪器,大部分时间都花在我的出站编码器上。 RXJava 回调有时会以 80k 秒的速度接收消息,但当我在 ChannelPipeline 上调用 write 时,我的出站编码器的吞吐量确实只有一半。因此,管道可能正在施加背压,因为编码器无法足够快地编码这些消息。也许我需要在编码器中缓冲消息
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 2012-05-11
    • 1970-01-01
    • 2018-03-18
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    相关资源
    最近更新 更多