[erlang-questions] How to handle a massive amount of UDP packets?

John-Paul Bader hukl@REDACTED
Sun Apr 15 23:41:01 CEST 2012


Ok, little update.

I've changed the implementation to use {active,false} and a manual 
gen_udp:recv loop but that made things only slightly faster. Then I 
commented out the part where I spawned the processes which compute and 
send back the response to the clients and this gave a _huge_ speed 
improvement.

I ran a benchmark on a fast server and could easily handle 100-200k 
packets per second without losing a single packet.

So clearly my problem is dispatching the packet/message to the worker 
processes. I will experiment with a worker pool next instead of spawning 
the processes on demand.

If you know how to do this dispatching with as little overhead as 
possible please let me know.

~ John



Magnus Klaar wrote:
> Hi!
>
> You only mention setting the {active, once} option. Are you also setting
> higher values for the recbuf, sndbuf and read_packets options? As with
> all non-10gen default settings they are set to a low but safe value that
> may not be optimal for all applications.
>
> MVH Magnus
>
> On Sun, Apr 15, 2012 at 8:08 PM, John-Paul Bader <hukl@REDACTED
> <mailto:hukl@REDACTED>> wrote:
>
>     Dear list,
>
>
>     I'm currently writing a bittorrent tracker in Erlang. While a naive
>     implementation of the protocol is quite easy, there are some
>     performance related challanges where I could use some help.
>
>     In the first test run as a replacement for a very popular tracker,
>     my erlang tracker got about 40k requests per second.
>
>     My initial approach was to initialize the socket in one process with
>     {active, once}, handle the message in handle_info with minimal
>     effort and pass the data asynchronously to a freshly spawned worker
>     processes which responds to the clients. After spawning the process
>     I'm setting the socket back to {active, once}.
>
>     Now when I switched the erlang tracker live the erlang vm was
>     topping at 100% CPU load. My guess is that the process handling the
>     udp packets from the socket could not keep up. Since I'm still quite
>     new to the world of erlang I'd like to know if there are some best
>     practices / patterns to handle this massive amount of packets.
>
>     For example using the socket in {active, once} might be too slow?
>     Also the response to the clients needs to come from the same port as
>     the request was coming in. Is it a problem to use the same socket
>     for that? Should I pre-spawn a couple of thousand workers and
>     dispatch the data from the socket to them rather than spawning them
>     on each packet?
>
>     It would be really great if you could give some advice or point me
>     into the right directions.
>
>     ~ John
>     _________________________________________________
>     erlang-questions mailing list
>     erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
>     http://erlang.org/mailman/__listinfo/erlang-questions
>     <http://erlang.org/mailman/listinfo/erlang-questions>
>
>



More information about the erlang-questions mailing list