2016-08-06 53 views
2

因此,在Joe Armstrong聲稱erlang進程很便宜並且vm可以處理數百萬進程之後。我決定在我的機器上進行測試: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)]. 

結果令人印象深刻的數百萬個進程 - 我得到的aprox 6.6微!秒平均產卵時間。但是,當啓動3m進程時,OS shell打印出「殺死」了erlang運行時間。 我使用+ P 5000000標誌運行erl,系統是:使用quadcore i7和8GB ram的arch linux。

+1

當您打印「殺死」並殺死進程時,您是否內存不足?請參閱http://stackoverflow.com/questions/726690/who-killed-my-process-and-why。 – Dogbert

+0

就是這樣,謝謝你的提示。 dmesg顯示內存不足故障 – Sharas

回答

5

Erlang進程很便宜,但它們不是免費的。 Erlang進程由spawn產生,使用338 words of memory,這是64位系統上的2704字節。產生300萬個進程將使用至少 8112 MB的RAM,不計算創建pid的鏈接列表和爲每個進程創建的匿名函數的開銷(我不確定它們是否在創建時共享就像你正在創建的那樣)。你可能需要10-12GB的可用內存來產生並保持300萬(幾乎)空的進程。

正如我在評論中指出的那樣(你後來證實),Linux Kernel在殺死Erlang虛擬機時打印出「Killed」消息,這很可能是因爲使用了太多的RAM。更多信息here

+0

內存是這裏的瓶頸。我正在運行Joe Armstrong在他的「編程Erlang」書中給出的示例代碼。它說他正在用8GB的i7進行測試,就像我一樣。而且他給出了創建3m流程的示例時間,而不會像使用掉換區域時會產生的繁殖時間大幅增加。我的機器沒有交換 - 因此殺死。 – Sharas