金利0無利息キャッシング – キャッシングできます

 | 

2009-06-18

コルーチンとウェブアプリケーション・スケーラビリティ

19:56 | コルーチンとウェブアプリケーション・スケーラビリティ - 金利0無利息キャッシング – キャッシングできます を含むブックマーク はてなブックマーク - コルーチンとウェブアプリケーション・スケーラビリティ - 金利0無利息キャッシング – キャッシングできます

継続ベースのウェブアプリケーションフレームワークとかたまに見かけたりするんですが、継続をセッション管理に使うとかは大したメリットがなくて、スケーラビリティの確保のために有益であると考えてます。2009年にもなって我々はセッション管理に困ってたりはしないんです。

Webアプリケーションにおける処理時間の殆どは何らかのI/O待ちだったりするので

  • 分散しているファイルディスクリプタの監視を一箇所でやらせる
  • I/O待ちが発生する箇所で停止
  • readable/writableになったら再開

という実装にすることで、並列度を上げることが出来ます。停止している間に他の処理ができるようになるわけですね。コルーチンを使うことで、この「停止と再開」を実現することができます。最近、コルーチン使ってクローラのロードアベレージを十分の一ぐらいにしました。これは特に問題なく動いていて、この高速化アプローチを段階的にウェブアプリケーションにも応用していこうと考えています。ウェブアプリケーション構築に必要な主要なコンポーネントを非同期化する必要があります。

非同期化の手法について

言語に関係なく、大体三つぐらいに集約されるような気がします。

  • 1. I/O多重化 + イベントフレームワーク
  • 2. ブロックする処理の外部化 + メッセージング
  • 3. コルーチンや軽量スレッド + ブロックする箇所で停止/再開

あるいは、これらを組み合わせて非同期化を実現することができます。

1はイベントベースとかイベントドリブンとか言われると思います。callbackを登録してイベントループを回す。イベントフレームワークってのはどれも大体一緒な感じで、イベントリスナ(selectとかepollとか)に監視対象(ファイルハンドルとか)を突っ込んでイベントが起きたら(readable/writableになったら)、callback関数が呼ばれる。JavaScriptDOMスクリプティングと似たようなもんだ。2はRPCとかそんなん。PerlにPOEというイベントフレームワークがありますが、容易にノンブロック化できないようなケースでは別プロセスを立ち上げて通信したりします。純粋に計算処理で時間がかかるような場合はネットワーク越しの別のマシンにやらせることができるというメリットがある。3の場合でもコルーチンを再開するタイミングを制御するために、1と同様にI/O監視を局所化する必要がある。タイマーで適当なタイミングで戻してもいいけどコンテキスト切り替えのコストが無駄になる。

非同期化にコルーチンを使うメリットは、既存のコードを殆ど変更しなくて済むことだ。1は全部イベントドリブンで書き直さないといけない。POE::Component::*を見よ。頑張りすぎだ。

http://search.cpan.org/search?query=POE%3A%3AComponent&mode=all

2はブロックしそうな箇所をプログラマが意識して切り離す必要がある。データの受け渡しに工夫しないといけない。複雑なオブジェクトを受け渡すならデータをシリアライズ/デシリアライズするコストがかかる。スレッド使って上手いことやれば高速化できるんだろうが、俺は知らないしやりたくない。

3は既存のコードがそのまま使える。手順はブロックしそうな箇所(並列化したい箇所)をコルーチン化するだけだ。I/O waitが発生する箇所で別のコルーチンに処理が移り、準備が出来たら再開される。

ということを昨日飲み屋で話したんだけど、そんな上手くいくわけ無いとか言われた。案外上手くいってるので是非試してみて欲しい。少なくともあなたのウェブアプリケーションをLispで書き直すよりは現実的だ。PerlではCoroというモジュールでコルーチンを実現できる。RubyではRuby1.9のFiberを使ったNeverBlock、Pythonではeventletというのがあるらしいよ。

yasyas2009/06/20 03:521年くらい前からやってる仕事でfiber + I/O multiprexerの実験コードを書いてました。
I/O multiprexerがfiberのスケジューラとして動くようにするためにちょっとしたコツが必要ですが、処理をシーケンシャルに記述できるというのは開発効率だけでなくコードの見通しの上でも有益なのでもっと広まって欲しいですね。

InfinityInfinity2011/07/03 03:38I went to tons of links bferoe this, what was I thinking?

wyujgidiewyujgidie2011/07/03 18:09MRL8PG <a href="http://aafpjzrtlhmx.com/">aafpjzrtlhmx</a>

urshqfokyurshqfoky2011/07/03 22:16vel5IA , [url=http://ytkklxnlnitp.com/]ytkklxnlnitp[/url], [link=http://nberbsiltqlz.com/]nberbsiltqlz[/link], http://bcdbxtsumfeq.com/

ckbtuuhvygckbtuuhvyg2011/07/05 18:00semRin <a href="http://sljbfiqqhzbr.com/">sljbfiqqhzbr</a>

JustusJustus2013/06/15 15:42BS low - raainotlity high! Really good answer!

FaigaFaiga2013/06/15 18:11Well put, sir, well put. I'll certanliy make note of that.

zumbruxqjxzumbruxqjx2013/06/17 14:55m0qavz , [url=http://djlyfosjqcbp.com/]djlyfosjqcbp[/url], [link=http://ijpskkuoxsac.com/]ijpskkuoxsac[/link], http://nkqcutjjnbqu.com/

nvsicyadnvsicyad2013/06/17 22:23xCyRbu <a href="http://afuwaxurzvmr.com/">afuwaxurzvmr</a>

pmescenpmescen2013/06/20 07:01EHmVFy , [url=http://tcjamaunxmii.com/]tcjamaunxmii[/url], [link=http://cdfnrpdmvouh.com/]cdfnrpdmvouh[/link], http://zliosdtbwzti.com/

 |