Erlangのランタイム・システムがどの程度頑健かを試すために、昼飯前に簡単なプログラムを仕掛けて走らせておきました。
-module(procbm). % プロセスのベンチマーク
-compile(export_all).procbm(Max) ->
random:seed(),
spawn(?MODULE, spawn_procs, [1, Max]).spawn_procs(N, N) ->ok;
spawn_procs(N, Max) ->
K = random:uniform(2000),
P = spawn(?MODULE, work, [K]),
io:fwrite("new proc spawned. pid=~w -------- #~w\n", [P, N]),
spawn_procs(N+1, Max).work(K) ->
io:fwrite("~w: I'm working.\n", [self()]),
timer:sleep(K*100),
work(K + 50).
ここに出てくる定数(生の数値)は何ら根拠のないエーカゲンなものです。とりあえず、プロセスをいっぱい作って、それらに軽い仕事をさせるってだけね。あまりにエーカゲンで詳細を公表しても意味ないからしないけど、普通のノートPC(古いThinkPad)で実行してます。
Eシェルのプロンプトからprocbm:procbm(20000).
として2万個のプロセスを生成させました。コマンド投入後すぐに外出しようと思っていたのだけど、しばらく眺めてしまったよ。プロセス1万個を超えたあたりから、workプロセス達の「働いている(I'm working.)」の声がうるさくて、spawn_procsが苦しくなったようですが、最後のころはまた持ち直してがんばってました。
結局、僕が眺めているあいだに2万個のプロセス生成は完了。その時点で使用メモリは四十数メガ。プロセス生成中はCPUを使い切ってましたが、その後は50%を超えることはなく、他のアプリケーションの邪魔をするようなこともないですね。僕が外から戻ってきたとき、メモリ使用が70メガほどだったので「あれっ、まさかリーク?」と思いましたが、今みたら55メガ程度。増えたり減ったり。
workプロセスはだんだんおとなしくなるはずなので、ほっておけば"I'm working."はまばらになると思うのだけど、、、しばらくこのままにしておこう。
[追記 date="3日後"]"I'm working."もだいぶ落ち着いてきました。もうそろそろ止めよう。簡単なタスクとはいいながら、2万個のプロセスが粛々と動き続けたわけで、Erlangランタイムすごいなー。[/追記]