由于将请求从主线程传递到工作线程,netty 中出现延迟?

2024-04-22

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

我想知道在将请求从老板线程传递到工作线程时是否会因为 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());

和服务器引导程序:

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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于将请求从主线程传递到工作线程,netty 中出现延迟? 的相关文章

随机推荐

  • 在SQL Server 2012 TSQL中,使用XML RAW、XML AUTO和XML PATH有什么区别

    正如标题所示 欢迎所有开放的思想 我在我的电脑上测试了一下 输出似乎是一样的 例如 USE BOB DATABASE SELECT ID Name First Name Last Name FROM DBO T User FOR XML A
  • 生成字符串所有组合的算法

    我在网上找到了一个链接 其中显示了生成字符串的所有组合的算法 http www mytechinterviews com combinations of a string http www mytechinterviews com comb
  • 为什么选择源进行 SQL 架构比较会导致 VS2012 崩溃?

    似乎没有任何原因 选择 SQL gt 架构比较 gt 新架构比较 然后尝试 选择源 会导致 Visual Studio 2012 崩溃 几个月来它一直按预期工作 除了尝试重新安装之外还有其他可能的修复方法吗 注意 尝试在 Visual St
  • 如何将数据从servlet传递到android应用程序

    I have a form in android upon submit im inserting it into database using servlet i have to show to user that form was in
  • 如何在JavaScript中计算3点之间的角度? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在 JavaScript 中获取 3 点之间的角度 如果我有积分A x1 y1 B x2 y2 and C x3 y3 我想得到由线A
  • Nightwatch.js 始终返回退出代码 1

    我尝试将 Nightwatch js 测试集成到 Jenkins 作业中 如果测试失败 我希望 Jenkins 构建失败 如果所有测试都通过 我希望构建通过 但我认识到夜巡总是返回exit code 1 测试通过或失败并不重要 但我期望ex
  • Python 转换日期格式

    给定一个像这样的字符串 2020 08 14 我如何将其转换为 14 August 2020 使用Python 3 您可以使用datetime用于重新格式化日期字符串的模块 使用strptime你可以从一个字符串读入一个datetime对象
  • 如何用 POST 替换 window.open(...)

    我目前有一些运行的代码window open urlWithGetParams 线 据我所知 这将迫使我使用GET要求 我想通过 POST 请求来完成此操作 有解决方法吗 我没有结婚window open 任何一个 我愿意接受任何允许我通过
  • 我可以换行 img 替代文本吗?

    我有一个由 css 样式设置为 100x75 的图像 当它不加载时 替代文本会加载到空间中 但会将容器扩展到超过 100 像素宽度 我怎样才能防止这种情况发生 要么把它剪掉 要么把它包起来 好吧 我在某种程度上明白了 我只是将图像包装在相同
  • QUERY Google Sheets 函数中同一字符串中的引号和撇号

    我想知道如何处理这样的查询 假设电子表格的单元格 A2 中包含以下文本 Case Bakers Flats 12 White Flour Tortillas 10 12ct 并需要将以下公式代入B2 QUERY importrange KE
  • 了解 JPA 序列生成器

    我正在使用 spring data JPA 的序列生成器将主键分配给实体 模型包含 Id GeneratedValue strategy GenerationType SEQUENCE generator seq post Sequence
  • 使用 GPUImageFilter 时发生崩溃

    我从 Github 上 Brad Larson 的教程开始 当我将这些代码添加到我的项目中时 void viewDidLoad super viewDidLoad GPUImageVideoCamera videoCamera GPUIma
  • reg 声明中的位顺序

    如果我需要使用 4 个 8 位数字 我会声明以下 reg reg 7 0 numbers 3 0 我对第一个和第二个声明 7 0 和 3 0 之间的区别感到很困惑 他们应该按什么顺序来 第一个是保留数字的大小 而第二个是保留数字的数量 还是
  • 为什么修改数组的副本会影响原始数组?

    大家好 如果这是一个菜鸟问题 我很抱歉 但我使用的是 python 我有一个问题 我复制一个数组 但当我修改副本时 它会影响原始数组 我想将边界矩阵的线性偏移添加到一组坐标 boundaries 5 818 0 0 0 0 0 0 5 81
  • TFS + 获取最新版本

    当我从 TFS 获取最新版本时 有没有办法列出已更新的文件 如果您使用的是 Visual Studio IDE 您可以在 输出 窗口中看到文件列表 要查看 输出 窗口 请选择菜单 视图 gt 输出 希望这可以帮助
  • Dialyzer 无法识别使用多态类型的函数中的错误

    背景 我正在尝试使用透析器进行多态打字 作为一个例子 我正在使用著名的Option类型 又名 Maybe Monad 现在在许多其他语言中都很流行 defmodule Test do type option t some t nothing
  • Kotlin 中参数的通用通配符

    我有一个用于监听 api 回调的抽象类 如下所示 ApiRs 是每个 API 响应对象都继承自它的父对象 abstract class ApiCallback
  • swift 中的 UIView viewwithtag 方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在努力学习一些快速的知识 我以编程方式添加标签 我想稍后更改它们的属性 viewwithtag 方法返回一个 UIView 如何从
  • 复制切片的通用方法

    我需要复制切片 以及底层数组的一部分 以便调用者不会改变数组的原始元素 我想我可以编写一个函数来对特定类型的数组执行此操作 func duplicateSliceOfSomeType sliceOfSomeType SomeType Som
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec