このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

Erlangの軽量プロセス、現在テスト中

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ランタイムすごいなー。[/追記]