[erlang-questions] Process spawn time with -smp
Rickard Green
rickard.s.green@REDACTED
Mon Apr 9 04:49:04 CEST 2007
Hi!
This test program isn't especially nice to the smp emulator. When a
process is placed in the run-queue, scheduled in, or scheduled out, a
lock on the run-queue has to be held. When a child processes in this
program has been spawned, it is put in the run-queue, later scheduled
in, and then immediately scheduled out. Since the test will make sure
that there will be plenty of processes in the run-queue, all scheduler
threads available will be woken. Since the child processes doesn't do
anything, the scheduler threads will more or less only fight about the
run-queue lock.
I ran the test program myself on a couple of our machines, but I didn't
get as bad figures as you got. The worst I got was a little more than
twice the time for the smp emulator compared to the non-smp emulator on
a machine with four cores. When I ran the smp emulator with only one
scheduler thread on that same machine I got times 5-30% longer than for
the non-smp emulator. This comparison is more interesting since there
will not be such a fight about the run-queue lock, as described above,
when processes actually do something.
BR,
Rickard Green, Erlang/OTP, Ericsson AB.
lang er wrote:
> Hi!
> I run code from Joe's new book on my macbook(2G RAM and 2GHz Intel
> Core Duo CPU) to test how fast erlang create processes.
>
> I compile Erlang with smp support, and I test with smp flag on and off.
>
> The following is the results :
>
> erl -noshell +P 1000000 -s processes max 800000 -s init stop
> Maximum allowed processes:1000000
> Process spawn time=4.16250 (8.02000) microseconds
>
> erl -smp -noshell +P 1000000 -s processes max 800000 -s init stop
> Maximum allowed processes:1000000
> Process spawn time=19.7000 (28.0012) microseconds
>
> So why process spawn is so slow with smp?
>
> -------------
> test code from joe's book:
>
> max(N) ->
> Max = erlang:system_info(process_limit),
> io:format("Maximum allowed processes:~p~n" ,[Max]),
> statistics(runtime),
> statistics(wall_clock),
> L = for(1, N, fun() -> spawn(fun() -> wait() end) end),
> {_, Time1} = statistics(runtime),
> {_, Time2} = statistics(wall_clock),
> lists:foreach(fun(Pid) -> Pid ! die end, L),
> U1 = Time1 * 1000 / N,
> U2 = Time2 * 1000 / N,
> io:format("Process spawn time=~p (~p) microseconds" ,
> [U1, U2]).
>
> wait() ->
> receive
> die -> void
> end.
> for(N, N, F) -> [F()];
> for(I, N, F) -> [F()|for(I+1, N, F)].
>
>
>
> BR!
> James
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
>
More information about the erlang-questions
mailing list