[erlang-questions] Unicorn-style load balancing in Erlang?

Loïc Hoguin <>
Thu Jan 3 02:07:48 CET 2013

I believe from the README that swarm creates processes that accept and 
then become workers as you mentioned.

On 01/03/2013 01:53 AM, Xiao Jia wrote:
> Thanks for your reply.
> I have used ranch before, and I think Unicorn is more than an acceptor
> pool. In ranch, acceptor processes only do "accept", and then dispatch
> the request to some worker process. I believe swarm works the same way
> as a middleman.
> In Unicorn, there's no separate worker (or acceptor) process; a
> prefork process is both acceptor and worker. All the prefork processes
> start out by calling "accept()" on the same listener socket. Then it's
> the OS kernel who determines which "accept()" to awake, while others
> remain sleeping.
>  From the documentation of ranch:
>> Our observations suggest that using 100 acceptors
>> on modern hardware is a good solution, as it's big
>> enough to always have acceptors ready and it's low
>> enough that it doesn't have a negative impact on
>> the system's performances.
> What if there's no separate worker process? Will many number of
> acceptor-and-workers have a negative impact as well?
> On Thu, Jan 3, 2013 at 5:25 AM, Daniel Goertzen
> <> wrote:
>> For bare acceptor pool libraries, take a look at...
>> https://github.com/extend/ranch
>> https://github.com/jeremey/swarm
>> And I would bet that most significant socket server apps written in Erlang
>> would use acceptor pooling of some sort.
>> Dan.
>> On Wed, Jan 2, 2013 at 10:09 AM, Xiao Jia <> wrote:
>>>  From http://www.erlang.org/doc/man/gen_tcp.html#accept-1:
>>>> It is worth noting that the accept call does not have to be issued
>>>> from the socket owner process. Using version 5.5.3 and higher of
>>>> the emulator, multiple simultaneous accept calls can be issued
>>>> from different processes, which allows for a pool of acceptor
>>>> processes handling incoming connections.
>>> Does it mean that we can have Unicorn-style load balancing in Erlang?
>>> If so, are there any existing servers or libraries making use of this
>>> feature?
>>> For those who are not familiar with Unicorn [1], it is a traditional
>>> UNIX prefork web server. Load balancing between worker processes is
>>> done by the OS kernel. All workers share a common set of listener
>>> sockets and does non-blocking accept() on them. The kernel will decide
>>> which worker process to give a socket to and workers will sleep if
>>> there is nothing to accept().
>>> btw, I also posted this question on StackOverflow [2] but no active
>>> responses there :-(
>>> [1]: http://unicorn.bogomips.org/
>>> [2]:
>>> http://stackoverflow.com/questions/14121987/unicorn-style-load-balancing-in-erlang
>>> ---
>>> Regards,
>>> Xiao Jia
>>> _______________________________________________
>>> erlang-questions mailing list
>>> http://erlang.org/mailman/listinfo/erlang-questions
> _______________________________________________
> erlang-questions mailing list
> http://erlang.org/mailman/listinfo/erlang-questions

Loïc Hoguin
Erlang Cowboy
Nine Nines

More information about the erlang-questions mailing list