Erlangのhttpドーピング
Erlangで書かれたWebサーバのyawsはかなり速い.
Apache並の性能が出る.
それはErlangが速いからだと思っていた.
でも,ソースを読んでみたら,ドーピングされていることがわかった.
同様のアプリで,mochiwebというErlangで書かれたWebサーバのフレームワークもあるけれど,これも同じでその方法を使っていた.
Erlangでは,TCP通信のドライバにいろいろなモードがあって,行単位で応答を返したり,FCGIやCORBAのパケットをあつかったりすることができる.
Erlangのマニュアルには書かれていないけれど,このモードにhttpというものがあって,それを使うと,httpヘッダの解析などをC言語で書かれたドライバ内で行うことができる模様.
undocumentedだけども,どちらのフレームワークも使用しているということは,その辺よく研究しているということなのかな.
Erlang本体についているWebサーバ(inetsのhttp_server)はそのモードは使っておらず,自前でパケットの解析をしているのは謎.
Erlang ML で,Erlangについているものは古くさくて,新しい設計のyawsがよい,というような話が以前流れていたけども,それはこの辺が理由だったのかも.
httpモードの内容は,Erlangソースの erts/emulator/drivers/common/inet_drv.c を読むといろいろ書いてある.
erts/AUTHORS を見ると,HTTP packet mode (R8) とあるので,だいぶ前から使えるようにはなっていた模様.
結局のところ,Erlang自体はそこまで速くなくて,ほかのWebサーバに対抗できる性能を出すには,C言語レベルでのパケット解析が必要な模様.
言い換えれば,自前でHTTP以外のプロトコルをがんばって実装する場合,C言語比でそれなりに性能が落ちてしまうということかな.
自前でinet_drvをいじるとか,BIFを追加してがんばる必要がある…と.
Erlangは動的な型の言語だし,バイトコードを実行するタイプなので(HiPE使えばコンパイルされるけど),やっぱりその辺が限界ということなのかも.
The comments to this entry are closed.
Comments