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