ページ

2010年1月13日

pywebsocketをちょっとだけ見てみた

pywebsocketというPython製のwebsocketを利用するためのApacheモジュールがあるらしいので、ちょっとだけ見てみました。ちなみにこのエントリはPythonとはあまり関係がありません。興味を持ったきっかけは、現状のApacheでC10Kをどうやって解決してwebsocketを実装したのだろうということです。結論は残念ながら単にApacheでwebsocketを利用するためだけのものでした。ただ、現状のインフラでちょっとだけ実用的にwebsocketを遊べるのはそれはそれですばらしいことです。僕がgolangで書いたサンプル、もしくはgolangはまだ実環境で使える代物ではないし。

Apacheはスレッドモデルで動きます。一つのリクエストが一つのスレッドを占有します。WebSocket自体は、AJAXによる定期的なポーリングやcometによるロングポーリングよりはオーバーヘッドは遙かに小さくメリットがあります。ただ、AJAXによる定期的なポーリングはサーバーサイドでは一瞬ですがWebSocketのようにコネクションが張りっぱなしの時は、1リクエスト1スレッドだと問題が発生します。たとえば、スレッド一つにつき、大体メモリ1Mを消費します。1000個のリクエストだとスレッドの維持だけで1Gのメモリを消費します。chatのサンプルは、一つのクライアントに対して二つのスレッドを使っていたので、単純に考えて2Gのメモリが必要です。さらにchatの場合、ほとんど何もしない状態なのに、スレッドのコンテキストの切り替えが発生し無駄に時間がかかります。それでも1000個ぐらいであれば多分問題ないですが、クライアントが増えると馬鹿になりません。まあ、メモリの方がネックになると思っていますが。

pywebsocketもmod_python経由でスレッドモデルなので、結局上のような限界が発生します。mod_pythonでクライアント-サーバみたいに動かすことで回避できるか期待しましたが、結局同じです。なので、スケールを考えてwebsocketを使うのにはAapacheの次のバージョンが必要かもしれません。

でも、待ちきれないという、そんなあなたにjettyで、jythonです。

0 件のコメント: