« RPN方式の金融電卓 HP-12C | Main | jQuery History プラグイン更新 »

Friday, May 08, 2009

Erlang linked-in driver

こちらで引用されているのを発見したのでコメントしてみます.

forkするみたい。pipeでやってるのかな。いずれにしろここがボトルネックか。。。

erlang-C ffiを作ろうとしている

erl_ddllの場合はforkはしない(ハズ)です.

なぜここがボトルネックになるかというと,

・ドライバと通信するのは load_driver したプロセスが行う(のが普通?)
・そうすると,他のプロセスは load_driver したプロセスを仲介して通信する必要がある
・すべての通信が1つのプロセス(のメッセージキュー)を中継する

中継プロセスのメッセージキューに複数のプロセスがメッセージを書き込むので,ここがボトルネックになります.
Erlangのメッセージキューは,キューが長くなるほどパフォーマンスが低下します.
処理が間に合わずキューに貯まれば,パフォーマンスが落ちて,更にキューが貯まる…という悪循環になってしまいます.
(R12Bの頃に確認した限りでは.R13Bではもしかしたら改善しているかも)

と,改めてマニュアルを読むと,Portを外部に出しておいて,直接ポートドライバにメ ッセージを送るようにして,返事を driver_send_term で送り返せば上記の問題は緩和するかも….
とはいえ,やっぱりポートドライバ上にはメッセージキューがあると思われるので,そこがボトルネックになりそうな気はします.

port_control だと直接呼び出せるようなので,これを使って呼び出し元のプロセスが直接呼び出せば,上記のメッセージキューのボトルネックも回避できるのかも.

この場合,SMPを有効にしてあれば,SMPのスレッド数分は同時にポートドライバの関数がコールされるのではないか…と推測しますが未確認です.

% 確か前に試して何かうまくできなかった気がするけど,詳しく覚えてなく(^^;



driver_outputという関数で返す。→ メモリ領域の解放はどうなるんだろう?

erlang-C ffiを作ろうとしている

driver_alloc で確保して,driver_output_term とかで結果を送った後,driver_free ですね.
メッセージとして送ったときにコピーされます.



みかログに載っているコードをコピってテストしてみたところ、10倍からは随分改善されたけど、マルチコアの優位性を使い切れていない。チューニングの問題なのかどうなのか。

erlang-C ffiを作ろうとしている

徐々に改善していくとは思いますが,排他制御のオーバーヘッドがあるのである程度仕方ないかなという気は….
プロセス間の通信をこんなに大量にやらなければ,SMPでちゃんと速くなりますが,アプリケーション特性によっては -smp disable の方が良いこともあるようです.
ある程度はメッセージの通信量を減らすとか,自分で努力しないとダメかもしれません.
(OTPで組むと,gen_*系とかメッセージいっぱい使うので,個人的にはパフォーマンスで不利なんじゃないかと思って,普段は自前でサーバを書いていたりしますが,正しいかは未検証)

ただ,R13Bでもかなり大幅な改善があったので,今後も期待できるとおもいます.たぶん...

|

« RPN方式の金融電卓 HP-12C | Main | jQuery History プラグイン更新 »

Comments

プログラミングはほとんど知らない上、Erlangも知らないのだけど、リソース割り当てと解放の間隔が短すぎることが原因でオーバーヘッドが大きくなっているような話に聞こえるんですが…。
なんとなーくキューイングするプロセス自体は、すごく軽いんじゃないかな、とは思うので。

ってこれじゃあ一般論ですね。場違いだったらすみませんです。

Posted by: ココノ | Saturday, May 09, 2009 01:31 AM

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 linked-in driver:

« RPN方式の金融電卓 HP-12C | Main | jQuery History プラグイン更新 »