« Yahoo!の形態素解析をMeCabで無理やり再現してみる | メイン | CRF++ 0.48 »

2007年07月08日

AjaxIMEのHTTPサーバは pre-pthread

C++と Pthreads でミニマルなHTTPサーバを書く にて、ネットワークサーバのさまざまな設計・実装方針がまとめられています。

   1. クライアントごとに fork
   2. 事前に fork - 各プロセスで accept
   3. 事前に fork - ファイルロックで accept を保護
   4. 事前に fork - Mutex ロックで accept を保護 (PTHREAD_PROCESS_SHARED)
   5. 事前に fork - ソケットディスクリプタパッシング
   6. クライアントごとにスレッド生成
   7. 事前にスレッド生成 - Mutex ロックで accept を保護
   8. 事前にスレッド生成 - メインスレッドで accept

AjaxIMEの変換エンジンは自作サーバで運用しているのですが、初期の実装は prefork、 すなわち4番の実装でした。

その後、fork の部分を thread に変更した pre-pthread (7番) に変更しました。

最大の理由は、辞書リソースの有効活用です。MeCabは同一プロセス内で同一辞書ファイルを開く場合 に限り、辞書リソースを共有します。数千個インスタンスを作ろうが、mmap される辞書オブジェクトは 1つで済むので、メモリの消費を抑えることができます。

prefork の場合は、同一プロセスではなくなるため、複数のかな漢字変換インスタンスを作るとそれぞれ別の 辞書オブジェクトが生成されてしまいます。AjaxIMEのサーバはメモリを512Mしか積んでいないため 70MB程度の変換用辞書を4つも5つもコピーするわけにはいきません。

投稿者 taku : 2007年07月08日 00:41

トラックバック

このエントリーのトラックバックURL:
http://chasen.org/~taku/blog/mt-tb.cgi/230