繁体   English   中英

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

[英]Erlang VM killed when creating millions of processes

因此,在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打印出来的“Killed”与erlang运行时一样。 我使用+ P 5000000标志运行erl,系统是:使用quadcore i7和8GB ram的arch linux。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM