20

我正在研究 Netty 4.0.0.Alpha5 代码,以了解如何处理线程。我还在http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34阅读了 Netty 4 新线程模型的介绍。

据我了解,目标是:

  • 线程亲和性,将 Channel 粘贴到单个线程(EventLoop)。我想这种方法是为了减少缓存未命中并改善 NUMA 硬件的情况。

所以,我想知道我的解释是否正确。如果我是对的,那么就会出现以下问题:

  • 在 ChannelPipeline 中有一个可能长时间运行的 ChannelHandler(例如数据库操作)可能会阻塞 EventLoop(线程),因此会阻塞分配给同一 EventLoop(线程)的所有其他 Channel。这种解释是真的吗?
  • 为了避免这个问题,我可以为长时间运行的 ChannelHandler 使用 EventExecutor,但是根据文档(参见上面的链接),Channel 再次卡在 EventExectuor 中的单个线程上,因此可能会再次阻塞分配相同的其他 Channel线程(在 EventExecutor 内)。我错过了什么还是这是真的?

我只是想了解为什么事情是这样的,并获取有关 Netty 4 设计意图的一些信息。

4

2 回答 2

8

对这两个问题都是正确的。通过将处理程序分配给非 I/O 事件组,您可以防止 I/O 线程被长时间运行的操作(例如数据库访问)阻塞。EventExecutorGroup您可以根据处理程序的作用指定大尺寸的。它与通常的线程池所做的并没有太大的不同。如果线程池很忙,任何执行长时间运行任务的尝试都将排队。

于 2012-10-18T16:27:42.660 回答
2

您的两点对于 Netty 3 也是如此。

Netty 3 有老板和工作线程的概念。老板线程负责接受新连接,然后将其卸载到工作线程。创建NioServerSocketChannelFactory.

现在 Netty 4 已经分别用父事件循环和子事件循环替换了这些老板和工作线程。但核心思想保持不变:为了摆脱每个连接的线程模型,您必须为一个线程分配多个连接。
因此,当您创建服务器时,将有一个固定的 N 个线程池,专用于处理连接。如果连接数低于 N,则每个线程不会有超过一个连接。另一方面,如果您有超过 N 个连接,则某些线程将管理多个连接。这是以循环方式完成的,请查看MultithreadEventExecutorGroup.next()

于 2014-01-21T10:52:39.987 回答