18

RoR4 Heroku アプリでの Puma (マルチスレッド + マルチコア サーバー) の構成について助けが必要です。そのための Heroku ドキュメントは最新ではありません。私はこれに従いました:構成の同時実行とデータベース接続。これにはクラスターの構成については言及されていないため、両方のタイプ(スレッドとマルチコア)を一緒に使用する必要がありました。

私の現在の構成:

./プロファイル

web: bundle exec puma -p $PORT -C config/puma.rb

./config/puma.rb

environment production
threads 0,16

workers 4
preload_app!

on_worker_boot do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
    config['pool']              = ENV['DB_POOL'] || 5
    ActiveRecord::Base.establish_connection
  end
end

質問:

a) Cluster ワーカーがフォークされているため、Unicorn のように before_fork / after_fork 構成が必要ですか?
b) アプリケーションに応じてスレッド数を調整するにはどうすればよいですか? 下げる理由は何ですか? / どのような場合に違いがありますか? 0:16 は既に最適化されていませんか?
c) Heroku データベースは 500 の接続を許可します。スレッド、ワーカー、および dyno の数に応じて、DB_POOL の適切な値は何でしょうか? - 並列で作業する場合、dyno ごとのワーカーごとのすべてのスレッドに唯一の DB 接続が必要ですか?

一般的に: 同時実行性とパフォーマンスに関して、私の構成はどのように見えるべきですか?

4

2 に答える 2

3

スレッドよりも少ない DB 接続は望ましくありません。個別のプロセスごとに独自の接続プールがあることに注意してください。したがって、DB が 20 の接続をサポートし、2 つのプロセスを実行する場合、タイムアウトの危険を冒さずに実行できる最大のスレッドは、それぞれ 10 の接続のプールを持つ 10 スレッドです。

Rails コンソール セッション用にいくつかの接続を残したいとします。また、バックグラウンド ワーカーと、それらがスレッド化されているかどうかにも注意してください。

ワーカーが別のプロセス (sidekiq) にある場合、ワーカーには独自のプールがあります。ワーカーのスレッドが Web プロセス (girl_friday または sucker_punch) から生成される場合、接続プールを共有するため、DB_POOL を Web スレッドの最大数より大きくする必要があります。

于 2015-08-14T21:11:56.583 に答える