由于从boss线程传递给工作线程的请求导致的netty延迟?

我有一些关于Netty(服务器端),TCP / IP应用程序的问题;

我想知道在将boss请求从boss线程传递给工作线程时是否会因为netty(由于缺少配置等)而存在延迟?

我在用 :

new OrderedMemoryAwareThreadPoolExecutor(350, 0, 0, 1, TimeUnit.SECONDS); 

实际上,我设置最大线程数350因为我不确定最佳数字。 我每分钟记录同时工作的线程数,似乎平均值太低(几乎不超过10 )。 所以我会减少这个数字,因为它不是必需的。

有没有其他参数,重要的一点,我应该知道,以获得最佳性能?

bootstrap.setOption("tcpNoDelay", true); – 设置此参数有什么缺点吗? 考虑到交货时间非常重要。

线程池执行器:

 OrderedMemoryAwareThreadPoolExecutor executor = new OrderedMemoryAwareThreadPoolExecutor(48, 0, 0, 1, TimeUnit.SECONDS); 

这是我的管道工厂:

  ChannelPipeline pipeline = pipeline(); pipeline.addLast("frameDecoder", new DelimiterBasedFrameDecoder(GProperties.getIntProperty("decoder.maxFrameLength", 8000 * 1024), Delimiters.nulDelimiter())); pipeline.addLast("stringDecoder", new StringDecoder( CharsetUtil.UTF_8 )); pipeline.addLast("frameEncoder", new NullTermMessageEncoder()); pipeline.addLast("stringEncoder", new JSONEncoder( CharsetUtil.UTF_8 )); pipeline.addLast("timeout", new IdleStateHandler(idleTimer, 42 , 0, 0)); pipeline.addLast("executor", new ExecutionHandler(executor)); pipeline.addLast("handler", new GServerHandler()); 

和ServerBootstrap:

 gServerBootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); gServerBootstrap.setPipelineFactory(new GServerPipelineFactory()); gServerBootstrap.setOption("backlog", 8129); gServerBootstrap.setOption("child.tcpNoDelay", true); gServerBootstrap.bind(new InetSocketAddress(GProperties.getIntProperty("server.port", 7679))); 

您可以为此配置建议什么?

Netty Boss线程仅用于设置连接,工作线程用于运行NioWorker(非阻塞读/写)或OioWorker(阻塞读/写)。

如果您有执行处理程序,则工作线程将向OrderedMemoryAwareThreadPoolExecutor提交消息事件。

1)将Netty I / O工作线程数增加到超过处理器数量* 2将无济于事。 如果您正在使用分阶段执行程序,则为非I / O任务提供多个分阶段执行处理程序可能会增加延迟。

注意:最好在OMTPE构造函数中设置自己的ObjectSizeEstimator实现,因为在计算使用的通道内存上花费了很多CPU周期。

2)您可以尝试其他一些Netty参数

  //setting buffer size can improve I/O bootstrap.setOption("child.sendBufferSize", 1048576); bootstrap.setOption("child.receiveBufferSize", 1048576); // better to have an receive buffer predictor bootstrap.setOption("receiveBufferSizePredictorFactory", new AdaptiveReceiveBufferSizePredictorFactory(MIN_PACKET_SIZE, INITIAL_PACKET_SIZE, MAX_PACKET_SIZE)) //if the server is sending 1000 messages per sec, optimum write buffer water marks will //prevent unnecessary throttling, Check NioSocketChannelConfig doc bootstrap.setOption("writeBufferLowWaterMark", 32 * 1024); bootstrap.setOption("writeBufferHighWaterMark", 64 * 1024); 

3)服务器引导程序应该是bootstrap.setOption(“child.tcpNoDelay”,true)。

有一个实验隐藏参数:

Netty NioWorker使用SelectorUtil.select等待选择器事件,等待时间在SelectorUtil中进行硬编码,

 selector.select(500); 

设置一个小值可以在netty sctp传输实现中获得更好的性能。 不确定TCP。

Q1)一切都增加了延迟。 Netty效率非常高,如果95%以上的用例延迟太高,我会感到惊讶

Q2)在开始担心它之前,自己测试你的性能并确定它是否有问题(延迟或吞吐量)。

Q3)此选项可能会有所帮助。 它不应该让它变得更糟。 许多现代操作系统自我调整得很好,我发现它没有像以前那么多。

您能否澄清一下您想要实现的延迟,因为它可以对您的设计产生重大影响? 是10毫秒,1毫秒,100美元,10美元?

1)我想知道在将请求从boss线程传递给工作线程时是否会因为netty(由于缺少配置等)而存在延迟?

我不认为这里有任何延迟。 线程在池中,只需要给它们工作。

问题2)是否还有其他参数,为了获得最佳性能,我应该注意哪些要点?

当谈到“最佳”性能时,我做了一系列测试,结果使用了大约16 *盒子上物理处理器数量的线程。 我尝试了数千个线程数,但当他们真的被猛烈抨击时,他们最终在GC中挣扎。

问题3)bootstrap.setOption(“tcpNoDelay”,true);. 设置此参数有什么缺点吗? 考虑到交货时间非常重要。

绝对定下这个。