当前位置: 首页 > 知识库问答 >
问题:

增加工作线程对Netty IO性能没有影响

轩辕海
2023-03-14

我运行Http服务器使用Netty I/O库在四核Linux机器上。使用默认工作线程池大小(在Netty中内部设置为2 x内核数)运行时,性能分析显示吞吐量上限为1k请求/秒,请求速率的进一步增加导致延迟几乎线性增加。

由于最大CPU利用率显示为60%,我根据下面的代码增加了工作线程的数量。然而,性能几乎没有任何变化,CPU仍然限制在60-70%。该进程不受内存、I/O或网络带宽的限制。为什么不通过增加工作线程来提高性能?我还可以做些什么来提高服务器性能以增加其容量。

EventLoopGroup group = new NIOEventLoopGroup(100);
ServerBootStrap serverBootStrap = new ServerBootStrap();
serverBootStrap.group(group)
               .channel(NioServerSocketChannel.class)
               .localAddress(..)
               ...

共有1个答案

漆雕嘉平
2023-03-14

如果您的代码使用的是纯粹的非阻塞I/O,您应该使用四核1kTPS。您应该分析Netty线程正在做什么,即它们是否被事件循环中的任何调用阻塞。VisualVM应该已经让你对正在发生的事情有了一个很好的了解,例如,在这里你可以看到Vert. x线程,它使用Netty在幕后睡觉:

您可以尝试的另一件事是禁用超线程并检查CPU利用率的行为:https://serverfault.com/questions/235825/disable-hyperthreading-from-within-linux-no-access-to-bios

 类似资料:
  • 我有一个错误,现在在生产中出现了两次,其中一个分叉/连接池停止工作,尽管它有工作要做并且正在添加更多工作。 这是我到目前为止得出的结论,以解释为什么要执行的任务队列被填满并且任务结果流停止。我有线程转储,其中我的任务生产者线程正在等待fork/连接提交完成,但是没有ForkJoinpool工作线程对此做任何事情。 不管我在做什么,这都不应该发生,对吗?线程转储来自检测到初始条件后的许多小时。我还有

  • 让我们想象一个场景a,其中有log4j。rootLogger=DEBUG和具有相同日志级别的文件追加器: 现在我们将与情景B进行比较: 我知道场景A比场景B要详细得多,会影响我的软件性能。但是现在,让我们与另一个场景C进行比较,在这个场景中,我将rootLogger设置为DEBUG,但将appender设置为INFO: 我用log4j创建的文件不会用DEBUG记录器中的大量信息写入,因为我设置了,

  • 本文向大家介绍MySql删除和更新操作对性能有影响吗,包括了MySql删除和更新操作对性能有影响吗的使用技巧和注意事项,需要的朋友参考一下 删除和更新操作的开销往往比插入高,所以一个好的设计需要减少对数据库的更新和删除操作。 3.1更新操作 数据库的更新操作会带来一连串的“效应”:更新操作需要记录日志(以便错误时回滚);更新可变长字段(如,varchar类型)会带来数据物理存储的变化(记录的移动)

  • 我有一个主机名列表,我应该通过使用正确的URL来打电话。假设我在链表中有四个主机名(hostA,hostB,hostC,hostD)- 执行hostA url,如果hostA启动,则获取数据并返回响应 此外,我的应用程序中运行了一个后台线程,其中包含阻止主机名列表(来自我的另一个服务),我们不应该调用该列表,但它每10分钟运行一次,因此阻止主机名列表只会在10分钟后更新,因此如果存在任何阻止主机名

  • 非单调递增的dts是什么意思? 如何使用libavformat以相同的编解码器连接2个视频文件? 流中dts到muxer的非单调递增 我相信当我增加pts和DTS时,我有正确的逻辑。我不知道我到底错过了什么。 谢了。

  • 问题内容: 我有这个JavaWeb应用程序,它可以从电子表格上传成千上万的数据,该电子表格是从上到下按行读取的。我用来在服务器端显示应用程序当前正在读取的行。 -我知道要创建一个日志文件。实际上,我正在创建一个日志文件,同时在服务器提示符下显示日志。 还有其他方法可以在提示上打印当前数据? 问题答案: 它可能会影响您的应用程序性能。大小会因您所运行的硬件类型和主机上的负载而异。 可以将其转化为性能