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 微!秒平均产卵时间。但是当启动 3m 个进程时,OS shell 打印 "Killed" with erlang 运行time gone。 我 运行 带有 +P 5000000 标志的 erl,系统是:带有四核 i7 和 8GB 内存的 arch linux。

Erlang 进程很便宜,但它们不是免费的。 spawn 产生的 Erlang 进程使用 338 words of memory,在 64 位系统上是 2704 字节。产生 300 万个进程将使用 至少 8112 MB RAM,这还不包括创建 pids 链表和为每个进程创建的匿名函数的开销(我不确定它们是否如果它们的创建方式与您创建的方式相同,则会共享。)您可能需要 10-12GB 的可用 RAM 来生成并保持 300 万(几乎)空进程。

正如我在评论中指出的(你后来证实了),"Killed" 消息是 Linux 内核在终止 Erlang VM 时打印的,很可能是因为耗尽了太多内存。更多信息 here.