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

时间:2016-08-06 17:34:38

标签: process erlang

所以在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)].

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

1 个答案:

答案 0 :(得分:7)

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

正如我在评论中指出的那样(后来你验证过),Linux Kernel在杀死Erlang VM时打印出“Killed”消息,很可能是因为占用了太多RAM。更多信息here