お世話になっております。
表題の件です。ここやRails4.2ですがここのサイトなどを見て、ActiveRecordのconnection_poolが実際どのように動いているか試してみました。DBがpostgresなので、接続数の確認のためSELECT * FROM pg_stat_activity
を使っています。
pumaを使って(プロセスは一つ)
10.times{|n| Thread.new{ Model.find_by(code: '1111') }} sleep(15)
とした時は期待通りにdatabase.ymlのpoolの制限が効いているのがわかりました。
Railsではコネクションプール数を設定していても、1スレッドあたり1コネクションしか使いません。つまり、シングルスレッドのUnicornでは、1ワーカープロセス = 1コネクションとなります。
とあるので、unicorn.rbを以下のようにして同じように試してみたところ、各プロセスにつき5つ接続されていました。この時、poolは3に設定していました。
rails_root = File.expand_path('../', __dir__) worker_processes 3 working_directory rails_root timeout 30 stderr_path File.expand_path('../../log/unicorn_stderr.log', __FILE__) stdout_path File.expand_path('../../log/unicorn_stdout.log', __FILE__) listen 3000 pid File.expand_path('../../tmp/pids/unicorn.pid', __FILE__) preload_app true
Thread.newが悪いのかと思い単純にfind_byを10回に変更してみましたが、なぜか各プロセスごとに2つ接続されていました。
原因がさっぱりわかりません。1ワーカープロセス = 1コネクションなら各プロセスにつき1つの接続でいいはずですし、Thread.newが悪いのであればpoolを3にしているのだから各プロセスにつき3つの接続までに制限できていいはずです。
unicornではActiveRecordのconnection_poolは使えないのですか?
また、実際はpassengerで動かしたいと思っているのですが、passengerでActiveRecordのconnection_poolを利用している方はいらっしゃるでしょうか...
あなたの回答
tips
プレビュー