[erlang-questions] Re: Unicast 20k messages, $500-$1000 bounty

Cliff Moon <>
Thu Jul 16 22:31:13 CEST 2009


So it turns out that the optimizations which mattered most were:

compile everything with HiPE, including mochiweb
bump the process priority for publishing
have pubsub write directly to the socket during its loop

The last two send it over the top.  The reason that the wall clock time 
was so high during the ets fold was because it was getting hung up 
context switching processes.  Each message sent out ends up putting a 
process in the run queue and erlang was not allowing the fold to 
complete before context switching off of the pubsub process.  So bumping 
the priority level helps a lot with fold time, however it simply delays 
the pain of all of that context switch.  The message has to wend it's 
way through two processes before it finally gets written to a socket.  
This means that at least 3 context switches, two for erlang procs and 
one for the linked in tcp driver, must happen per publish for 20k 
messages.  So making pubsub write directly to the tcp socket is a big 
win in terms of absolute latency.  I think there are some more 
inefficiencies to tease out, but I'm unsure whether it can be gotten 
below 1s on a small instance.


Joel Reymont wrote:
>
> On Jul 16, 2009, at 6:18 PM, Cliff Moon wrote:
>
>> The problem you're seeing there is process scheduling overhead.  In 
>> the fun it sends a message and it's doing an ungodly amount of 
>> context switching.  The way to get around this is to bump the process 
>> priority level of the process which iterates the ets table.
>
>
> bumping priority to high before the broadcasting list comprehension 
> and lowering it after results in ~10ms broadcasting time and shaves 
> ~300ms off max latency. Loving it!
>
> Mac is at ~2s (one box for everything) and ec2 is ~2.7s when bots are 
> spread over 3 instances. It looks like process priority is a very 
> useful tool in one's toolbox.
>
> ()4> bot:test(flashbot, 20000, 
> 'ip-10-244-47-97', 8081).
>
> =INFO REPORT==== 16-Jul-2009::19:05:18 ===
> setup: 69312.72ms, good: 20000, bad: 0, run: 72269.01ms
>   315.0020ms | min
>   500.0000ms | 2019   -  10.10%
>  1000.0000ms | 3651   -  18.25%
>  1500.0000ms | 4433   -  22.17%
>  2000.0000ms | 5259   -  26.30%
>  2500.0000ms | 4057   -  20.29%
>  3000.0000ms | 581    -   2.90%
>  2713.3960ms | max
> ok
> ()5> bot:test(flashbot, 20000, 
> 'ip-10-244-47-97', 8081).
>
> =INFO REPORT==== 16-Jul-2009::19:08:37 ===
> setup: 65606.03ms, good: 20000, bad: 0, run: 68362.39ms
>   328.4420ms | min
>   500.0000ms | 1361   -   6.80%
>  1000.0000ms | 4231   -  21.15%
>  1500.0000ms | 4477   -  22.38%
>  2000.0000ms | 4490   -  22.45%
>  2500.0000ms | 4051   -  20.26%
>  3000.0000ms | 1390   -   6.95%
>  2716.1440ms | max
> ok
> ()6> bot:test(flashbot, 20000, 
> 'ip-10-244-47-97', 8081).
>
> =INFO REPORT==== 16-Jul-2009::19:10:45 ===
> setup: 99778.01ms, good: 19953, bad: 47, run: 104700.73ms
>   313.9300ms | min
>   500.0000ms | 1420   -   7.12%
>  1000.0000ms | 4553   -  22.82%
>  1500.0000ms | 3987   -  19.98%
>  2000.0000ms | 4777   -  23.94%
>  2500.0000ms | 4241   -  21.25%
>  3000.0000ms | 968    -   4.85%
>  3500.0000ms | 0      -   0.00%
>  4000.0000ms | 0      -   0.00%
>  4500.0000ms | 7      -   0.04%
>  4143.9490ms | max
> ok
>
> ---
> Mac hacker with a performance bent
> http://www.linkedin.com/in/joelreymont
>
>



More information about the erlang-questions mailing list