« 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