Optimizing Netty for fast socket accept/creation
Jeanfrancois Arcand
Jeanfrancois.Arcand at Sun.COM
Wed Jul 8 11:30:54 EDT 2009
Salut,
이희승 (Trustin Lee) wrote:
> Hi Carl,
>
> One more question. :)
>
> Does the accept throughput increase linearly as the number of accept
> threads (the number of bound ports in your case) increases?
>
> If you take a look at NioServerSocketPipelineSink.java:161, you will see
> the following code:
>
> bossExecutor.execute(new IoWorkerRunnable(
> new ThreadRenamingRunnable(
> new Boss(channel),
> "New I/O server boss #" + id +
> " (channelId: " + channel.getId() +
> ", " + channel.getLocalAddress() + ')')));
>
> I increased the number of acceptor threads like the following:
>
> for (int i = 0; i < 2; i ++) {
How many core your machine has? We usually use the number of core as an
indication.
> bossExecutor.execute(new IoWorkerRunnable(
> new ThreadRenamingRunnable(
> new Boss(channel),
> "New I/O server boss #" + id + '-' + i +
> " (channelId: " + channel.getId() +
> ", " + channel.getLocalAddress() + ')')));
> }
>
> and was indeed able to get much better result. However, increasing the
> number of acceptor threads to 3 or 4 did not help much.
Same observations.
A+
--Jeanfrancois
Do you have the
> same experience with your workaround? Could you apply this modification
> to see how the modified Netty performs comparing to your workaround?
>
> Thanks,
> Trustin
>
> On 07/07/2009 06:48 PM, Carl Byström wrote:
>> Hi Trustin!
>>
>> I wouldn't call it bad performance, it's just that I need more
>> performance :)
>> While it's understandable to use one accept (boss thread) for accepting
>> connections, I can't help thinking if things could be improved with
>> multiple accept threads.
>> When using the forking model in Unix and forking after you start
>> listening on your port you can get the effect of having multiple
>> processes listening on the same socket (file descriptor).
>> However, the JVM is inherently single-process so achieving the same
>> thing there is harder (impossible?). Maybe there are some OS-specific
>> "hacks" that can be used? Relying on certain behaviors, such as
>> fork/accept in Unix etc. Also, I know that combining these things with
>> epoll can be tricky. Have had some problems with Python with epoll +
>> multiple accept processes.
>>
>> Think I'll resort to listening on multiple ports (if nothing else comes
>> along) to achieve a better socket open/close performance.
>> Been using 3.1.0.CR1 for my tests.
>>
>> - Carl
>>
>>
>> On Mon, Jul 6, 2009 at 8:59 AM, "이희승 (Trustin Lee)"
>> <trustin at gmail.com <mailto:trustin at gmail.com>> wrote:
>>
>> Hi Carl,
>>
>> Sorry for the late response first of all.
>>
>> On 06/30/2009 11:05 PM, Carl Byström wrote:
>> > Been experimenting some with Netty the last couple of days. As an avid
>> > MINA fan, Netty looks great!
>>
>> Thanks! :)
>>
>> > What's been bothering is the "slow" socket accept, which limits the
>> > throughput of my application. (Request/response based ála HTTP 1.0, so
>> > no keep-alive).
>> > (The socket accept operation isn't "slow", I just feel that it
>> could be
>> > improved thus increasing my throughput)
>> >
>> > After profiling my application I found that accept is taking up
>> most of
>> > the time. While this probably is as expected, I can't help feeling
>> > limited by that fact.
>> > I've tried having the same server listening on multiple ports thus
>> > getting a separate boss thread doing the accept. This actually doubles
>> > the number of req/s while retaining the same response time. I realize
>> > this isn't anything peculiar (multi-core machine with another accept
>> > thread for it to chew on). But it gets me thinking if there's more one
>> > can do to optimize this.
>> >
>> > Is it possible to speed up the socket accept operation
>> > a) by tuning Netty?
>> > b) by tuning the JVM?
>> > c) by tuning the OS/kernel?
>> >
>> > While I fear things like this might be very sensitive to how the OS
>> > implements the TCP stack, I hope at least there are some general
>> advice
>> > or places to start looking.
>> > Appreciate any hints or tips regarding this. (Running on RHEL5 64-bit,
>> > Java 1.6.0_10-b33, Intel Quad-Core Q6600)
>>
>> Which Netty version are you using? Netty uses only one thread for
>> accepting an incoming channel for each port, and it could be why it's
>> not performing good enough. If you observe the accept performance issue
>> with 3.1.0.CR1, I'd like to fix it before GA.
>>
>> Thanks!
>> Trusitn
>> >
>> > - Carl
>> >
>> >
>> >
>> ------------------------------------------------------------------------
>> >
>> > _______________________________________________
>> > netty-users mailing list
>> > netty-users at lists.jboss.org <mailto:netty-users at lists.jboss.org>
>> > https://lists.jboss.org/mailman/listinfo/netty-users
>>
>> _______________________________________________
>> netty-users mailing list
>> netty-users at lists.jboss.org <mailto:netty-users at lists.jboss.org>
>> https://lists.jboss.org/mailman/listinfo/netty-users
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> netty-users mailing list
>> netty-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/netty-users
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
More information about the netty-users
mailing list