所以在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。
答案 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。