2011年1月27日木曜日

nginxのGridFSブリッヂ

ここ数日サイトが非常に重たい状態となっておりご迷惑をおかけしております。エラーレポートが(メールで)送られてくるので問題は把握していたのですが、解決までに時間がかかってしまっています。

アプリケーション的、システム構成的、両面からのアプローチを検討し、2つの対策を行いました。


  • アプリケーションの見直し

  • システム構成変更による改善



アプリケーションの見直しは、モバイル対応を行った際に変更した部分が関係すると考え、その点を中心に見直しを行いました。いくつか問題点があったため変更を行いリリースしています。

もう一点、システム構成を変更して、保存された写真の提供方法を改善しました。

写真の提供方式について少し掘り下げて解説したいと思います。

旧方式ではnginxからFastCGIによりdjangoへ接続し、そこからMongoDB GridFSのファイルを取得していました。pythonで処理が行えるためプログラミング的にデバッグがやりやすい、加工等の処理が行い易いというメリットがありますが、反面、一度画像データをバッファリングする必要があり、メモリを圧迫する状況となっていました。



GridFSへのアクセスパスを効率的なものに変更できないか探したところ、nginxからMongoDB GridFSへブリッヂできるnginx-gridfsというライブラリを見つけました。

これはAPL / GPLで提供されるnginxの拡張モジュールで、nginxがHTTP経由で受け取ったリクエストに応じ、GridFS内のファイルを取得し、レスポンスすることができます。nginx内でも画像データのバッファリングは行っていると考えられますが、少なくともpythonプロセスでメモリを浪費することはなくなります。



パフォーマンス障害は深刻な問題だったため早急に対応を行う必要があり、構成変更前後でのベンチマークは取得していませんが、体感値ではずいぶんと高速化した印象です。

機能強化ももちろん必要ですが、ユーザが快適に利用出来ることも同じように重要です。時間は限られており様々な要望にすぐ答えることは難しいのですが、ユーザの体験を大事にして、便利で使いやすいサイトを目指して今後も改善を続けたいと思います。