gpt4 book ai didi

ruby-on-rails - Heroku 上的 Puma 集群配置

转载 作者:行者123 更新时间:2023-11-29 11:10:17 29 4
gpt4 key购买 nike

我需要一些帮助来配置我的 RoR4 Heroku 应用程序上的 Puma(多线程+多核服务器)。关于它的 Heroku 文档不是最新的。我关注了这个:Concurrency and Database Connections对于配置,它没有提到集群的配置,所以我不得不同时使用这两种类型(线程和多核)。

我当前的配置:

./Procfile

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) 我是否需要像 Unicorn 中那样的 before_fork/after_fork 配置,因为集群 worker 是 fork 的?
b) 如何根据我的应用程序调整我的线程数 - 降低它的原因是什么?/在什么情况下会有所作为? 0:16不是已经优化了吗?
c) Heroku 数据库允许 500 个连接。根据线程、工作人员和测功机计数,DB_POOL 的一个好的值是多少? - 在并行工作时,每个 dyno 的每个工作线程的每个线程是否都需要一个单独的数据库连接?

总的来说:我的配置应该如何实现并发性和性能?

最佳答案

a) Do I need the before_fork / after_fork configuration like in Unicorn, since the Cluster workers are forked?.

通常不会,但是因为您使用的是 preload_app,所以是。预加载应用程序启动并运行一个实例,然后为工作人员分配内存空间;结果是您的初始化程序只运行一次(可能分配数据库连接等)。在这种情况下,您的 on_worker_boot 代码是合适的。如果您不使用 preload_app,那么每个 worker 都会自行启动,在这种情况下,使用初始化程序将是像您正在做的那样设置自定义连接的理想选择。事实上,如果没有 preload_app,您的 on_worker_boot block 就会出错,因为此时 ActiveRecord 和 friend 甚至都没有加载。

b) How do I tune my thread count depending on my application - what would be the reason to drop it down? / In what cases would it make a difference? Isn't 0:16 already optimized?

在 Heroku(和我的测试)上,您最好将 min/max 线程与 max <= 相匹配DB_POOL 设置。 min 线程允许您的应用程序在没有负载时降低资源速度,这通常有助于释放服务器上的资源,但在 Heroku 上可能不需要; dyno 已经致力于为网络请求提供服务,也可以让它们准备就绪。虽然不需要设置 max 线程 <= 您的 DB_POOL 环境变量,但您冒着消耗池中所有数据库连接的风险,然后您有一个线程想要一个连接但无法获得它,您可以得到旧的“ActiveRecord::ConnectionTimeoutError - 无法在 5 秒内获得数据库连接。”错误。不过,这取决于您的应用程序,您很可能拥有 max > DB_POOL 并且没问题。我会说你的 DB_POOL 应该至少与你的 min threads 值相同,即使你的连接没有急切加载(如果你的 5:5 线程不会打开 5 个连接应用程序永远不会访问数据库)。

c) The Heroku database allows 500 connections. What would be a good value for DB_POOL depending on thread, worker and dyno count? - Does every thread per worker per dyno require a sole DB connection when working parallely?

Production Tier允许 500,要清楚 :)

每个 dyno 的每个工作线程的每个线程都可以使用一个连接,这取决于它们是否都在同时尝试访问数据库。通常,连接在完成后会被重用,但正如我在 b) 中提到的,如果您的线程数大于池数,您可能会遇到麻烦。连接将被重用,所有这些都由 ActiveRecord 处理,但有时并不理想。有时连接会空闲或死亡,这就是为什么建议打开 Reaper 来检测和回收死亡连接。

关于ruby-on-rails - Heroku 上的 Puma 集群配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17903689/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com