マルチコアでスケールしないErlangVM
マルチコア時代のErlang・・・のような書かれ方をしていることが多いけれども,
実際試してみるとそううまくスケールしてくれない.
Erlang の ring benchmark を Squeak Smalltalk で
の ring_bench を利用させていただいて,smp有無で測定をしてみると,こんな感じ.
smpを使うと,速くなるどころか約1/7の性能しか出なくなってしまう.
> erl -noshell -eval 'ring_bench:start(1000,10000), halt().' N = 1000, M = 10000; elapsed time = 1470 (1494) miliseconds> erl -smp -noshell -eval 'ring_bench:start(1000,10000), halt().'
N = 1000, M = 10000; elapsed time = 9810 (9826) miliseconds
測定環境は,クアッドコアの Intel(R) Xeon(R) CPU E5335 @ 2.00GHz × 2,の環境.(合計8コア)
実際に利用していても,-smpを付けると遅くなるケースが目立つ.うーむ...
今後Erlang言語のバージョンアップで,改善するとよいんだけども...
----
追記.jijixiさんに言及いただいたので.
うーん、たしか ring benchmark ってシーケンシャルにメッセージを送っていくものだから、スケールしないのはむしろ当たり前なんじゃないのかな。並列性が期待できない処理を smp にやらせても、逆にオーバーヘッドが増えて遅くなるだけというのは納得の行く結果だけど……なんかわし、勘違いしてるだろうか。
ええ,確かにその通り.(^^;
元々smp環境で処理が遅くなる問題があって,メッセージの速度をテストしてみたら
あまりにも遅かったので書いたという経緯だったのです.
でも,スケールしないことをテストするなら,リングを複数用意する等の方が適切ですね.
本家のMLにも投げてみたのですが,以下の返事でした.
I ran your benchmark on a machine similar to yours and got a time 6.7 times longer for the R11B-5 emulator with smp support compared to the emulator without smp support. With the, to be, R12B release I got a time 4.4 times longer.
ってわけで,R12Bでだいぶ良くなる模様です.
また,メッセージサイズを増やせば,差は縮まるとのこと.
確かに増やせば縮まりました.
そのほか,リンクインドライバのほとんど(fileとinet以外全部?)は
ドライバ単位でロックされてしまうので,その辺の影響も大きいかもしれない.
もう少し調べたらまた書いてみます...
The comments to this entry are closed.
Comments