【问题标题】:Increasing worker threads has no effect on Netty IO performance增加工作线程对 Netty IO 性能没有影响
【发布时间】:2020-09-02 17:19:56
【问题描述】:

我在四核 Linux 机器上使用 Netty I/O 库运行 Http 服务器。使用默认工作线程池大小(在 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(..)
               ...

【问题讨论】:

  • 是什么让您确定进程不受内存、I/O 或网络带宽的限制?
  • 我捕获机器上的各种统计数据并将它们导出到度量服务器进行分析(prometheus)。这些包括内存/堆使用、交换使用、网络 I/O 等。一切都远低于 40%。

标签: multithreading performance netty


【解决方案1】:

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

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

【讨论】:

  • 我通过 JConsole 检查了线程活动。许多 NIO 工作线程即使在活动高峰期也显示在 epollwait 状态,所以我有点困惑为什么他们无法处理更多请求。是否有阻止处理的内部队列?有趣的是,当我从双核升级到四核处理器时,我能够将容量从 600 个请求/秒增加到 1000 个请求/秒。但是,两者的 CPU 仍然上限为 60%。
  • 您有多少个 HTTP 连接?如果你所有的请求都来自同一个 HTTP 连接,它就不会飞。至少在 HTTP/1.x 中,因为在 HTTP/1.x 中连接没有多路复用。
  • 每个请求都来自不同的 http 客户端连接。接近 1000 个入站连接。
  • 那么您需要分享您的应用程序的更多详细信息 :)
猜你喜欢
  • 1970-01-01
  • 2018-12-02
  • 2015-01-20
  • 2011-09-26
  • 2018-04-29
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2012-04-16
相关资源
最近更新 更多