2016-09-08 7 views
0

私たちはHerokuでかなり複雑なRails設定をしています。Rails、Heroku、Unicorn、Sidekiq、Hirefireをすべて素敵に演奏する

一般的な日には、Unicorn(各2x、3ユニコーンの従業員)と15人の従業員のDynosが遅延ジョブを実行する約10のWeb Dynosを持っていますが、変動しますので、hirefireを使用してコストを節約する。私たちのPostgresデータベースは400の接続を可能にします。

先週、私はついに私たちが数年間使っていたDelayed :: Jobsのキューにうんざりしました。私たちは10分ごとに実行されていた一連のジョブを持っています。すべてのジョブを実行するのに10分以上かかるので、キューにバックアップされます。私は過去にいくつかの成功を収めていたので、Sidekiqへの移行を決定しました。

これまでのところうまくいきましたが、私たちのウェブダイノスが一貫性を失うことがわかりました。 、基本的に

Old new relic graph

New newrelic graph

しかし、ここでは正確に同じ時間帯の前の週のように見えたものです。たとえば、ここでは3時間、昨日の私達の新しい遺物グラフでありますサイドキックの前に、私たちの仕事は私たちのウェブダイノスに全く影響を与えていないようですが、今はそうです。私の唯一の推測は、私たちの10分ごとのジョブが実行されると、一時的に私たちのポストグル接続を圧倒して、Web dynosを遅くしているということです。仕事がウェブに影響すると私が想像できる唯一の方法です。

これらを少しずつ別々にしておくか、お互いに影響を及ぼしていないか、Webレスポンスタイムがより一貫していますか?

ここに私たちのsidekiq.ymlです:

--- 
:concurrency: 5 
production: 
    :concurrency: <%= ENV['WORKER_POOL'] || 15 %> 
:queues: 
    - [instant, 3] 
    - [fetchers, 2] 
    - [mailers, 1] 
    - [fetch_all, 1] 
    - [moderation, 1] 
    - [default, 1] 
    - [reports, 1] 
    - [images, 1] 
    - [slack, 1] 

そして、我々のsidekiq.rb

require 'sidekiq' 

Sidekiq.configure_server do |config| 
    database_url = ENV['DATABASE_URL'] 
    if database_url 
    pool = ENV['WORKER_POOL'] || 15 
    new_database_url = "#{database_url}?pool=#{pool}" 
    ActiveRecord::Base.establish_connection(new_database_url) 
    end 
end 

Sidekiq.default_worker_options = { retry: 1 } 

我々はをフルに活用できるように、我々はsidekiqワーカーインスタンスのDBにプールの設定を上書きしています並行性

そして、我々のdatabase.ymlの

production: 
    database: myapp_production 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 

そして、我々の

worker_processes 3 
timeout 30 
preload_app true 
listen ENV['PORT'], backlog: Integer(ENV['UNICORN_BACKLOG'] || 200) 

before_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead' 
    Process.kill 'QUIT', Process.pid 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.connection.disconnect! 
end 

after_fork do |server, worker| 

    Signal.trap 'TERM' do 
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT' 
    end 

    defined?(ActiveRecord::Base) and 
    ActiveRecord::Base.establish_connection 
end 

unicorn.rbそして、私たちのProcfile:私たちのhirefireマネージャーが

ように設定されている

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 
redis: redis-server 
worker: bundle exec sidekiq -e production -C config/sidekiq.yml 

Web:

enter image description here

労働者:

enter image description here

任意の提案ですか?

答えて

0

それは見守らなければならないが、非常に有望な修正が私のconfig/database.ymlにsidekiq労働者のためのprepared_statementsをオフにされているようだ:

default: &default 
    adapter: postgresql 
    encoding: unicode 
    pool: 5 
    prepared_statements: <%= !Sidekiq.server? %> 
関連する問題