Unicornでslow restart

Unicornの同時接続数がわりと少ないのに気づいたので、えいやとworker_processesを増やしたら今度はdeploy時にちょっと詰まり気味になってしまった。

これは、deployのタイミングで重いシステムコールであるforkを連発するため、と思われる。

そこで、Startletの--spawn-intervalのようなことをunicornでもやりたい。

設定ファイルで、

# config/unicorn.rb
before_fork do
  # 起動時や再起動で一気にforkしまくると遅くなるので、intervalを加える
  if Unicorn::HttpServer::WORKERS.size > 10
    sleep 0.4
  end

end

のようにやれば、起動時に連発してforkしなくなってよくなったっぽい。

もちろんbefore_forkは起動時のみに呼ばれるわけではなく、子プロセスの数が減って調整したタイミングや、unicorn-killerとかで殺されて再度起動した、みたいなケースでも呼ばれうるので、そういう場合にsleepが挟まっても問題ないか、は考慮する必要がありそう。