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

John-Paul Bader hukl@REDACTED
Mon Apr 16 11:31:39 CEST 2012


Hey Chandru,

how many packets per second did you have to deal with and how big are 
they? Just to have something to compare to.

~ John

Chandru wrote:
> Hi John,
>
> Our RADIUS server which handles our data network is written in Erlang.
> We've experimented with various values of recbuf and read_packets
> options for the UDP socket. We also use {active, once}. The receiving
> process receives a packet and spawns a new process to handle it. That is
> all it does. The spawned process then executes the rest of the business
> logic.
>
> That won't be your problem. The problem will be to make sure your system
> is stable while handling all those packets. We use overload control at
> the receiver. You have to pretty much look at the entire execution path
> for each packet and ensure there are no bottlenecks. At that kind of
> load, every little bottleneck shows up sooner or later.
>
> cheers
> Chandru
>
> On 15 April 2012 19:08, 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