unicorn-standbyをリリースしました

Tsukasa OISHI

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