unicorn-standbyをリリースしました
unicorn-standbyは、development環境などでunicornのメモリ消費量を抑えることができます。
https://github.com/tsukasaoishi/unicorn-standby
unicornを起動すると、masterプロセスと最低でもひとつのworkerプロセスが立ち上がります。
Railsアプリだと、それがシンプルなものでもあわせて200MBくらいにはなると思います。さらに microservices などを採用していたりすると、いくつものRackアプリが起動することになります。5つもRackアプリが存在していると、それだけで1GBにもなってしまいます。
unicorn-standbyは、unicornの立ち上げ時には最低限なコードしかロードしません。workerプロセスも起動しません。メモリ消費は20MB程度です。
最初にそのRackアプリへのアクセスが発生したタイミングで、必要なコードをロードしてworkerプロセスを立ち上げます。そのため、初回起動時のレスポンスは遅くなってしまいます。しかし、それ以降は通常のunicornと何も変わりません。USR2などのシグナルをなげてunicornを再起動すると、ふたたびstandbyモードに戻ります。
microservicesを採用していても、開発時にすべてのサービスを利用することはあまりないと思います。使わないサービスのためにメモリを使われるのは無駄でしかありません。そういうときにunicorn-standbyを使います。production環境では使わないほうがいいでしょう。
使い方は簡単です。Gemfileに以下を追加します。
group :development do
gem "unicorn-standby"
end
development環境でしか使わないと思うので、developmentグループの中で定義しておきます。
Rackアプリを起動するときに、 unicorn
コマンドのかわりに unicorn-standby
コマンドを使います。
bundle exec unicorn-standby -c config/unicorn.rb -D
psコマンド等で確認すると、以下のようにプロセスがひとつだけ起動しているはずです。
name 1000 11.0 0.2 2477948 20648 ?? S 10:00AM 0:00.69 unicorn-standby master (standby) -c config/unicorn.rb -D
standbyモードのときは、プロセス名に (standby)
と表示されます。
ブラウザ等でこのRackアプリにアクセスすると以下のように通常のunicornの状態になります。
name 1001 0.0 1.3 2574060 105072 ?? S 10:02AM 0:00.96 unicorn-standby worker[0] -c config/unicorn.rb -D
name 1000 0.0 1.0 2548444 81392 ?? S 10:00AM 0:03.96 unicorn-standby master -c config/unicorn.rb -D