« Erlangで数字→ローマ数字変換 | Main | ErlangでComet »

Monday, June 04, 2007

Erlangの+Aオプション

Erlangでは,+Aオプション付きで起動することで,async thread pool を作成し,ブロックするいくつかのオペレーションを別スレッドで処理することが出来る.
デフォルトは0なので,通常は無効.

通常は非smpカーネルなら1つ,smpカーネルならCPUコアと同数のスケジューラスレッドが起動し,このスケジューラスレッドがErlangのコードを実行する.
(-smp オプションをつけたときは,+S オプションでスケジューラスレッドの数を変更可能)
で,ブロックするシステムコールを呼ぶと,スケジューラスレッドが応答待ちをしてしまうので,効率が悪くなってしまう.
+A オプションを使って async thread pool を追加すると,このブロックしてしまう処理をasyncスレッドへ移動でき,スケジューラスレッドは別のErlangコードの実行を続けることが出来る.
その結果,I/O待ちが多く発生するようなコードがかなり高速化できる.

※ただし,どのような処理がasyncスレッドを使用するのかは不明...

smpカーネルを使ってスケジューラスレッドを多数起動しても似たような効果がでるものの,async thread poolの方がブロックされる処理に特化されている分,軽い(?)ような感じ.(ベンチは取っていないけれども)

しかし,この+Aオプションを使うと,Linux環境で segmentation fault が起きて Erlang VM が落ちるという問題が発生.
早速MLにバグ報告したところ,週末に報告したのに1.5日でパッチが届いた.素早い.
(というか休日に対応していただいた感じ?)

このオプションを試そうと思う方は,R11B-5 がリリースされるまでは,
[erlang-bugs] +A option causes segmentation fault on Linux
にあるパッチを適用すれば,直ります.


C言語でC10KなサーバをI/O非同期方式(epollとか)で書く場合は,
・syncを別スレッドに隔離して実行して,実行後に応答を返す
・事前に別スレッドで必要なデータをmlockかけておいてから,本体のスレッドで処理する
などなど,結構ややこしい回避策をとる必要があるわけで,その辺のめんどくささを考えると,Erlangの+Aオプションは非常に手軽.

いくつかテストコードを書いてベンチを取った限りでは,C言語よりは5倍以上は遅いようだけども(動的な型言語だし?),動的な型言語の中では一番速いんじゃないかと思える性能.
Cより手軽で,Perlとかより高速,という中間的な部分で今後も活用していけそう.

社内でErlang使える人がほとんどいないのが問題だけども(^^;

|

« Erlangで数字→ローマ数字変換 | Main | ErlangでComet »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack


Listed below are links to weblogs that reference Erlangの+Aオプション:

« Erlangで数字→ローマ数字変換 | Main | ErlangでComet »