Erlang VM在创建数百万个进程时被杀死

Sha*_*ras 3 erlang process

所以在Joe Armstrongs声称erlang进程很便宜并且vm可以处理数百万个之后.我决定在我的机器上测试它:

process_galore(N)->
    io:format("process limit: ~p~n", [erlang:system_info(process_limit)]),
    statistics(runtime),
    statistics(wall_clock),
    L = for(0, N, fun()-> spawn(fun() -> wait() end) end),
    {_, Rt} = statistics(runtime),
    {_, Wt} = statistics(wall_clock),
    lists:foreach(fun(Pid)-> Pid ! die end, L),
    io:format("Processes created: ~p~n
          Run time ms: ~p~n
          Wall time ms: ~p~n
          Average run time: ~p microseconds!~n", [N, Rt, Wt, (Rt/N)*1000]).

wait()->
    receive die ->
         done
    end.

for(N, N, _)->
    [];
for(I, N, Fun) when I < N ->
    [Fun()|for(I+1, N, Fun)].
Run Code Online (Sandbox Code Playgroud)

对于百万个流程来说,结果令人印象深刻 - 我得到6.6微米的aprox!秒平均产卵时间.但是当启动3m进程时,OS shell打印出的"Killed"与erlang运行时一样.我使用+ P 5000000标志运行erl,系统是:使用quadcore i7和8GB ram的arch linux.

Dog*_*ert 7

Erlang进程很便宜,但它们并不是免费的.通过spawn使用338个字的内存产生的Erlang进程,在64位系统上为2704字节.产生300万个进程将使用至少 8112 MB的RAM,不计算创建链接列表和为每个进程创建的匿名函数的开销(我不确定如果它们像你一样创建它们是否共享'正在创建.)你可能需要10-12GB的可用内存来产生并保持300万(几乎)空进程.

正如我在评论中指出的那样(后来你验证过),Linux Kernel在杀死Erlang VM时打印出"Killed"消息,最有可能消耗掉太多内存.更多信息在这里.