Hatena::ブログ(Diary)

torutkの日記 RSSフィード

2014-06-30

[Redmine]Redmine、Unicorn、Nginxでの動作安定化(タイムアウトとメモリ関係)

あるプロジェクト用に構築したRedmineがすこぶる不安定となっています。仮想ゲストのCentOS 6.5にUnicornを入れてRedmineを動かし、前段にNginxをリバースプロキシで動かしています。不安定なときはログを見るとNginxでタイムアウトが発生しています。どうやらUnicornの応答がときどきなくなっている感じです。このプロジェクトでは、巨大なファイル(GBオーダー)がばんばん添付としてアップロードされています。ディスクフルも起きています。

他にもUnicornとNginxで動かしているRedmineがありますが、不安定の発生する傾向としてはサイズの大きなファイルを添付したりダウンロードしたあとに発生しているようです。

安定化のためには、UnicornとNginxの設定を見直す必要がありそうです。しかし、今まではインターネット上にある設定をほぼ真似て動かしていただけで、パラメータを洗い直すにはUnicornとNginxを一から勉強しないといけない状況です。

そこで、先週から自宅環境で新規にCentOS 6.5の仮想ホストを立てて、そこに一からRedmine環境を構築し始めました。

せっかくなので、MySQLもCentOS 6標準搭載の5.1ではなく、CentOS 7標準搭載予定のMariaDB 5.5を入れ、NginxもEPELの1.0ではなく1.6を入れてみたりと環境をリフレッシュしてみました。構築の経緯は次のURLに記述しました。

http://www.torutk.com/projects/swe/wiki/Redmine%E3%82%92CentOS_6%E4%B8%8A%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%E3%83%BCUnicorn%E3%81%A8Nginx%E7%B7%A8

Redmineの安定化にむけて

今回の調査で達したRedmine環境の安定化に向けてのポイントは次の3点でした。

  • Nginxのタイムアウトを長めに設定することで、巨大なファイルのアップロード時などのUnicornの処理を中断せずにきちっと待つことが大切
  • Unicornが(正確にはRailsが、あるいはRedmineのRailsの使いかたが)ファイルのアップロード時にファイルサイズをほぼそのまま使用メモリとして喰ってしまうので、添付ファイルの上限を物理メモリとの兼ね合いで規制することが大切
  • Unicornのワーカープロセスがメモリを喰って肥大化したら退治してあげる仕組みを講じることが必要

1つ目のNginxのタイムアウトは、proxy_connect_timeout(コネクション時)、proxy_read_timeout、proxy_send_timeoutあたりです。通常のページビューなら数秒でUnicornの応答があるはずですが、ファイルのアップロードやダウンロード時は長めに取っておく必要がありそうです。

2つ目の物理メモリは、アップロードしたファイルのファイルサイズ分だけUnicornがメモリを喰うので、Redmineで定義する添付ファイルの最大サイズを十分賄える物理メモリを用意します。あるいは、物理メモリの許す範囲で添付ファイルの最大サイズを規定します。

なお、複数のUnicornワーカープロセスがいるので最悪それぞれメモリ喰いが発生しますが、それは3つ目の対策でなんとかすることとします。

3つ目は、Unicornの標準では対策ができそうになく、Unicorn Worker Killerというgemパッケージを使って(インストールガイドのとおりの手順で)実現しました。他にもmonitで監視という方法やcronで定期的に監視するという方法も見かけましたが、Railsアプリケーションでの設定の簡単さがUnicorn Worker Killerのいいところです。

https://github.com/kzk/unicorn-worker-killer

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/torutk/20140630/p1
リンク元