Netty 4 - EventLoopGroup - EventLoop - EventExecutor - 线程关联

时间:2012-10-17 06:54:03

标签: netty

我正在研究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(Thread),因此会阻止分配给同一EventLoop(Thread)的所有其他Channel。这种解释是真的吗?
  • 试图避免这个问题我可以使用EventExecutor来运行长时间运行的ChannelHandler,但是根据文档(参见上面的链接),Channel再次粘贴到其EventExectuor中的单个线程,因此可能会再次阻止其他通道分配了相同的线程(在EventExecutor中)。我错过了什么或这是真的吗?

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

2 个答案:

答案 0 :(得分:8)

对这两个问题都是正确的。通过将处理程序分配给非I / O事件组,可以防止I / O线程被长时间运行的操作(如数据库访问)阻止。您可以指定大型EventExecutorGroup,具体取决于处理程序的功能。它与通常的线程池没有什么不同。如果线程池忙,则任何执行长时间运行任务的尝试都将排队。

答案 1 :(得分:2)

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

Netty 3有老板和工人线程的概念。 boss线程负责接受新连接,然后将其卸载到工作线程。 创建NioServerSocketChannelFactory时可以配置工作线程的数量。

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