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

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

我想知道是否有可能因netty(由于缺少配置等)而将请求从boss线程传递给工作线程时出现延迟?

我在用 :

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 ms,1 ms,100 us,10 us吗?


1)我想知道是否有可能因netty(由于缺少配置等)而将请求从boss线程传递给工作线程时出现延迟?

我不认为这里有太多的延迟。 线程在池中,他们只需要给予工作。

问题2)是否还有其他参数,我应该注意哪些重要的方面以获得最佳性能?

当谈到“最佳”性能时,我进行了一系列测试,最后使用了大约16倍的线程数,这些线程数是机箱上物理处理器的数量。 我尝试了几千个线程数,但是当他们真的受到抨击时,他们最终在GC中发生了颠簸。

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

绝对设置这个。

链接地址: http://www.djcxy.com/p/95209.html

上一篇: latency in netty due to passing requests from boss thread to worker thread?

下一篇: Django Rest Framework associating Related Model with current User