Railsでunicornがforkするタイミング
Amazon Linux + Rails 4.2.3 + unicorn 4.9.0
preload_app true
にしている環境。
unicornがどのタイミングでforkするのか知りたくてこんなログを仕込んでみた。
結果、config/environments/development.rb
の読み込みよりは後だと分かった。
Railsがある程度の初期化を行った後でforkしているのだろうが、どうやって「Railsの初期化完了」を検知しているのだろうか。
誰か知っていたら教えて下さい。
Rails.application.configure do
open("/path/to/log", "a") do |f|
f.puts "in configure #{Time.now}"
end
end
worker_processes 3
before_fork do |server, worker|
open("/path/to/log", "a") do |f|
f.puts "before_fork"
end
end
after_fork do |server, worker|
open("/path/to/log", "a") do |f|
f.puts "after_fork"
end
end
結果
in configure 2016-02-16 11:12:29 +0900
before_fork
before_fork
before_fork
after_fork
after_fork
after_fork
[2016-02-17]
straceしてみた。初めstraceログをforkで検索したところ見つからず。代わりにcloneがログに残っていた。
forkは内部でcloneを呼んでいる単なるglibcレベルのラッパーらしい。
http://thorstenball.com/blog/2014/06/13/where-did-fork-go/
さて、昨日仕込んでopen()のおかげで、before_forkが呼ばれた直後にcloneしていることはわかったが、まだ詳細は不明。
次はunicornのソースでpreload_appの周辺を調べてみよう。
[2016-02-20]
build_app! if preload_app
のようにしてbuild_app!
を呼んでいる箇所がある。
def build_app!
if app.respond_to?(:arity) && app.arity == 0
if defined?(Gem) && Gem.respond_to?(:refresh)
logger.info "Refreshing Gem list"
Gem.refresh
end
self.app = app.call
end
end
app
の引数が0個ならばapp.call
で得られる別のオブジェクトをapp
に代入しなおしている。これによって初期化済みのRailsが返っているのだろうか。Rackの仕様ではcall
の引数はenv
1個だと思っていたが、0個の場合とは何かで決まっているのだろうか。
Author And Source
この問題について(Railsでunicornがforkするタイミング), 我々は、より多くの情報をここで見つけました https://qiita.com/aosho235/items/c363a043a668946f6845著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .