<p dir="ltr">+1</p>
<div class="gmail_quote">On 21 Nov 2014 04:53, "Andy Till" <<a href="mailto:atill@mail.com">atill@mail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Short outline of how erts_use_sender_punish works, please comment if there are any errors in the description.<br>
<br>
erts_use_sender_punish is a flag hard coded to 1 (true), when it is true a process sending messages to another process will have its reduction count reduced by the number of messages in the receivers message queue multiplied by four.  Sending messages to processes with zero messages in the queue is free in terms of reductions, but sending messages to load queues is very expensive and will lead the scheduler to context switch to another process more often.<br>
<br>
In the case where the the relationship between of producers and consumers is one to one, this makes sense.  It provides back pressure when part of the system is loaded.<br>
<br>
In the case where there is one producer to many consumers, if one consumer gets a flood of messages and the producer is punished then the punishment is not only on the producer but on all other consumers because the producer cannot create enough work for them as it used all of its reductions.<br>
<br>
This makes performance unpredictable when work cannot be spread evenly.<br>
<br>
Could this be made to be configurable using a process flag?<br>
<br>
Cheers<br>
<br>
Andy<br>
<br>
Code:<br>
<br>
<a href="https://github.com/erlang/otp/blob/a70f0ce9b34e4db61dacb8db24f9ab5671ed4c8a/erts/emulator/beam/erl_init.c#L694" target="_blank">https://github.com/erlang/otp/<u></u>blob/<u></u>a70f0ce9b34e4db61dacb8db24f9ab<u></u>5671ed4c8a/erts/emulator/beam/<u></u>erl_init.c#L694</a> <br>
<a href="https://github.com/erlang/otp/blob/682a6082159568f40615f03d12d44ee70edd14c6/erts/emulator/beam/bif.c#L2058" target="_blank">https://github.com/erlang/otp/<u></u>blob/<u></u>682a6082159568f40615f03d12d44e<u></u>e70edd14c6/erts/emulator/beam/<u></u>bif.c#L2058</a> <br>
<a href="https://github.com/erlang/otp/blob/a8e12f7168c14cc765a63a51c838d065412795d7/erts/emulator/beam/erl_message.c#L504" target="_blank">https://github.com/erlang/otp/<u></u>blob/<u></u>a8e12f7168c14cc765a63a51c838d0<u></u>65412795d7/erts/emulator/beam/<u></u>erl_message.c#L504</a><br>
<br>
Previous mentions and issues with this feature:<br>
<br>
<a href="http://erlang.org/pipermail/erlang-questions/2011-July/060314.html" target="_blank">http://erlang.org/pipermail/<u></u>erlang-questions/2011-July/<u></u>060314.html</a><br>
<a href="http://erlang.org/pipermail/erlang-questions/2011-July/060042.html" target="_blank">http://erlang.org/pipermail/<u></u>erlang-questions/2011-July/<u></u>060042.html</a><br>
<br>
______________________________<u></u>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/<u></u>listinfo/erlang-questions</a><br>
</blockquote></div>