« 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

The comments to this entry are closed.

TrackBack


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

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