Ajax IMEに関する補足

さて,先日の報告で私が聞き逃した点に関して,工藤氏にメールで伺ったところ,即座に的確な回答が返ってきた(が,またもや報告が遅れてすまない…).
基本的には,彼のブログ「きまぐれ日記」の2007年7月8日の記事「AjaxIMEのHTTPサーバは pre-pthread」に簡単な説明が掲載されているとのことである(なお,この時には直前に彼の同僚の高林哲氏のブログの「C++と Pthreads でミニマルなHTTPサーバを書く」という記事が投稿された直後であり,こういう技術的議論がすぐ波及していく会社の雰囲気というのはいかにも活気があっていいよね…).というわけで,この記事と彼の返事をアーキテクチャ的な観点から簡単にまとめておく.

  • HTTPサーバは,事前にスレッドを生成・Mutexを使って排他的にaccept()するタイプの自作の軽量サーバ.
  • 仮名漢字変換スレッドは4つ生成しておき,リクエストを取得できたスレッドがそのまま変換処理をおこなう.
  • MeCabは同一プロセス内で同一辞書を開く場合に限りmmap()された辞書リソース(70MB程度)を共有することができるので,このスレッド化により辞書を共有しメモリ消費を押さえることができた(現在の運用サーバの実メモリは512MB).
  • HTTPサーバはlocalhostにしかbindせずに,そこにApacheのreverse proxyを用いてアクセスしている.
  • 現在の運用状況は2変換/秒で,ロードアベレージも0.02程度.理論的には1,800変換/秒まで耐えれるはず.