Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Netty 4 - EventLoopGroup - EventLoop - EventExecutor - Thread affinity

Tags:

I am studying the Netty 4.0.0.Alpha5 code in order to find out how threading is handled. I also read the introduction to the new threading model of Netty 4 at http://netty.io/wiki/new-and-noteworthy-in-4.0.html#wiki-h2-34.

As I understand it, the goals are:

  • Thread affinity, stick a Channel to a single Thread (EventLoop). I guess this approach was taken to reduce cache misses and to improve the situation on NUMA hardware.

So, I am wondering whether my interpretation is right or not. And if I am right, then the following question arises:

  • Having a possibly long running ChannelHandler (e.g. a database operation) in the ChannelPipeline might block the EventLoop (Thread) and will therefore block all other Channels assigned to the same EventLoop (Thread). Is this interpretation true?
  • Trying to avoid that problem I could use a EventExecutor for the long running ChannelHandler, but according to the documentation (see link above) a Channel is again stuck to a single Thread within its EventExectuor and might therefore again block other Channels which are assigned the same Thread (within the EventExecutor). Did I miss something or is this true?

I am just trying to understand why the things are the way they are and to get some information about the design intentions of Netty 4.

like image 710
user1752169 Avatar asked Oct 17 '12 06:10

user1752169


People also ask

What is EventLoop in Netty?

EventLoop. A Netty EventLoop is a loop that keeps looking for new events, e.g. incoming data from network sockets (from SocketChannel) instances). When an event occurs, the event is passed on to the appropriate event handler, for instance a ChannelHandler .

What is Netty thread?

At its core, Netty is a Java library that facilitates network operations. It supports both blocking and non-blocking I/O, connection-oriented protocols such as TCP as well as connectionless protocols such as UDP, and managing data transfer on both the client and the server.


1 Answers

True to the both question. By assigning a handler to a non-I/O event group, you can prevent an I/O thread from getting blocked by long running operations such as database access. You can specify an EventExecutorGroup with large size depending on what the handler does. It's not very different from what usual thread pool does. If thread pool is busy, any attempt to execute a long running task will be queued.

like image 53
trustin Avatar answered Sep 27 '22 21:09

trustin