<div dir="ltr">Packet delivery happens roughly as follows:<div><br></div><div>1. The network card gets the packet.</div><div>2. The network card stores the packet in a kernel buffer.</div><div>3. The Erlang VM reads packets out of the kernel buffer and into its own memory space. This opens up the kernel buffer for more UDP packets to arrive.</div><div>4. The Erlang VM sends a message to a mailbox of a process with the data.</div><div><br></div><div>Rules:</div><div><br></div><div>* If the kernel buffer is full, new arrivals are dropped on the floor.</div><div>* The kernel buffer is set separately, often with an operating system default.</div><div>* The VM won't flood a process unless it has {active, true} set.</div><div><br></div><div>{read_packets, K} controls what happens in 3. in the above. If set at 5, once the kernel tells the VM there are data available to read, the VM will read out 5 packets. It won't read more packets until a new packet arrives at the socket in which case it will read up to 5 packets more. Note that if the arrival rate is larger than the consumption rate then packets will eventually gets dropped on the floor. With UDP, your responsibility is to handle this situation.</div><div><br></div><div>{active, N} controls how many packets can pre-delivered into the mailbox with no signs of progress from the process itself. It corresponds to a limiter at 4. in the above. You have situations when N < K, N > K and N == K to think about here. In those situations, you may end up with lost packets if the system goes over the capacity it is able to systematically handle.</div><div><br></div><div>The kernel tracks stats for how many packets it has thrown away. I don't know if the Erlang VM does somewhere (it should, provided that it throws data on the floor).</div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Jan 7, 2017 at 10:39 PM Frank Muller <<a href="mailto:frank.muller.erl@gmail.com">frank.muller.erl@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_msg">Hi Alex</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Still didn't get it. In your example 100 UDP packets arrive so the socket's ready for reading. Then, N=5 are read out of 100.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Why you said 5 will be read until new one arrives?</div><div class="gmail_msg">There's still 95 ready for reading right away after delivering the first 5. I'm right?</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Thank you.</div><div class="gmail_msg">/Frank</div><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div class="gmail_msg">Le sam. 7 janv. 2017 à 22:17, Alex S. <<a href="mailto:alex0player@gmail.com" class="gmail_msg" target="_blank">alex0player@gmail.com</a>> a écrit :<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_msg"><div class="gmail_msg">{read_packets, X} refers to number of UDP packets that are read whenever the socket is notified "ready". So if 100 UDP packets arrive at the same time, only 5 will be read until a new one arrives. There isn't really a way to know how many dgrams are waiting on a socket, so that's an anti-flood option.<br class="gmail_msg"></div>{active, X} refers to number of UDP packets that are immediately sent to Erlang process instead of being read into an internal buffer.<br class="gmail_msg"></div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"></div></div><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg">2017-01-07 14:04 GMT+03:00 Frank Muller <span class="gmail_msg"><<a href="mailto:frank.muller.erl@gmail.com" class="gmail_msg" target="_blank">frank.muller.erl@gmail.com</a>></span>:<br class="gmail_msg"></div></div><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">Hi guys,</span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"></span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">Can someone explain me the semantic behind {read_packets, Integer} for UDP:</span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><a href="http://erlang.org/doc/man/inet.html" class="gmail_msg" target="_blank">http://erlang.org/doc/man/inet.html</a></span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"></span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">I understand the associated doc, but what i can’t get is how this option affects me if i set it for example with:</span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">1. {read_packets, 20} + {active, once}</span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">2. {read_packets, 20} + {active, 100}</span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"></span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">How many packets my process will receive in each case?</span><div class="gmail_msg"><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">And are these packets send as multiple messages one packet at a time, or as one message representing a list of N packets?</span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"></span><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">Thank you</span><span class="m_1782726840863659552m_2459149249576291929HOEnZb gmail_msg"><font color="#888888" class="gmail_msg"><br style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg"><span style="font-family:UICTFontTextStyleBody;font-size:17px" class="gmail_msg">/Frank</span></font></span></div><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"></blockquote></div></div><div class="gmail_extra gmail_msg"><div class="gmail_quote gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">_______________________________________________<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg">erlang-questions mailing list<br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><a href="mailto:erlang-questions@erlang.org" class="gmail_msg" target="_blank">erlang-questions@erlang.org</a><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" class="gmail_msg" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"></blockquote></div><br class="gmail_msg"></div><br class="gmail_msg"><br class="gmail_msg"></blockquote></div></div>
_______________________________________________<br class="gmail_msg">
erlang-questions mailing list<br class="gmail_msg">
<a href="mailto:erlang-questions@erlang.org" class="gmail_msg" target="_blank">erlang-questions@erlang.org</a><br class="gmail_msg">
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" class="gmail_msg" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br class="gmail_msg">
</blockquote></div>