当前位置: 首页 > 知识库问答 >
问题:

在Heroku上的Puma集群配置

高寒
2023-03-14

在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) 我是否需要像Unicorn中那样的before\u fork/after\u fork配置,因为集群工作线程是分叉的?
b)如何根据我的应用程序调整我的线程数-将其放下的原因是什么?/在什么情况下会有所不同?0:16不是已经优化了吗?
c)Heroku数据库允许500个连接。根据线程、工作线程和动态计数,DB_池的最佳值是多少在并行工作时,每个线程每个工作线程每个dyno是否需要一个单独的DB连接?

一般来说:我的配置在并发性和性能方面应该是什么样的?

共有2个答案

翟修永
2023-03-14

您不希望数据库连接少于线程。请记住,每个单独的进程都有自己的连接池,因此,如果您的数据库支持20个连接,并且您想运行两个进程,那么您可以运行的最多线程是10个线程,每个线程有10个连接池。

您希望为rails控制台会话保留一些连接。还要注意后台工作人员,以及他们是否有线程。

如果您的员工处于单独的流程(sidekiq),他们将拥有自己的人才库。如果工作线程是从web进程生成的(girl_friday或sucker_punch),则您希望DB_池大于web线程的最大数量,因为它们将共享一个连接池。

通安宁
2023-03-14

a) 我是否需要像Unicorn中那样的before\u fork/after\u fork配置,因为集群工作线程是分叉的?。

通常不会,但因为您使用的是预加载应用程序,所以会。预加载应用程序使实例启动并运行,然后为工作人员分配内存空间;结果是您的初始值设定项只运行一次(可能是分配数据库连接等)。在本例中,您的on\u worker\u boot代码是合适的。如果您没有使用preload\u app,则每个工作程序都会自行启动,在这种情况下,使用初始值设定项将非常适合像您这样设置自定义连接。事实上,如果没有preload\u app,您的on\u worker\u boot块将出错,因为此时甚至没有加载ActiveRecord和朋友。

b) 我如何根据我的应用程序调整线程数-删除它的原因是什么?/在什么情况下会有所不同?0:16不是已经优化了吗?

在Heroku(和我的测试)上,您最好将您的min/max线程与max匹配

c) Heroku数据库允许500个连接。根据线程、工作线程和动态计数,DB_池的最佳值是多少在并行工作时,每个线程每个工作线程每个dyno是否需要一个单独的DB连接?

生产层允许500,要清楚:)

每个dyno每个辅助角色的每个线程都可以使用一个连接,这取决于它们是否都试图同时访问数据库。通常连接一旦完成就会被重用,但是正如我在b)中提到的,如果你的线程大于你的池,你可能会有不好的时间。连接将被重用,所有这些都由ActiveRecords处理,但有时并不理想。有时连接会闲置或死亡,这就是为什么建议打开收割者来检测和回收死亡的连接。

 类似资料:
  • 我正在尝试部署一个运行在puma和jruby上的rails应用程序。程序文件如下所示 彪马的配置放在 配置/puma.rb 我对工人有条件初始化的原因是因为Heroku抱怨(或者可能是彪马)工人模式不适用于JRuby和Windows;无论如何, 我在heroku上注意到的奇怪行为是(与我的本地环境不同),集群Puma实例启动时没有任何问题,并选择两个不同的端口来绑定,即3000和5000。 但是,

  • 拜托,我需要你的帮助。 自上周以来,我一直在努力尝试在Windows服务器上配置兔子MQ集群。我重新安装了 RabbitMQ 3.7.8 和 ErlangOTP 21-1 超过 15 次,试图找出问题并修复它,但不幸的是,我所有的尝试都失败了。 我的环境: 三个虚拟机与操作系统: Windows 服务器 2012 环境变量设置: 安装步骤:(针对每台服务器) 完成以上服务器的安装后,我开始配置集群

  • 我在AWS(ElastiCache)上配置了Redis集群。 它有一个配置endpoint和6个节点(3个碎片)。 在这里阅读npm模块的文档时,它说您必须合并ioredis才能使其用于Redis集群。 我共享了以下配置,该配置适用于单个Redis节点,但不适用于集群 我的问题是-如何合并ioredis来支持集群? 这对我来说是一个巨大的障碍,所以任何帮助都将受到高度赞赏。 全网找例子,一无所获!

  • 可能更多的是试图克服学习曲线和实际代码问题。我很抱歉,如果这似乎是努比什,目前我在生产中得到这个错误。 基本上,我一直收到这个“redis池太小了”,我迷失了从哪里开始,我实际上迷失了基本上理解如何准确地用美洲狮或配置后的任何东西,如缩放等。 下面是我收到的错误后的配置。 procfileweb:bundle exec puma-C config/puma.rb worker:bundle exe

  • 本文介绍如何对 Kubernetes 上的集群进行初始化配置完成初始化账号和密码设置,以及批量自动执行 SQL 语句对数据库进行初始化。 注意: 如果 TiDB 集群创建完以后手动修改过 root 用户的密码,初始化会失败。 以下功能只在 TiDB 集群创建后第一次执行起作用,执行完以后再修改不会生效。 配置 TidbInitializer 请参考 TidbInitializer 示例和 API

  • 我尝试了这个设置: 服务器1: 服务器2: 是设置不正确,还是证书有问题? 组织中以前的Artemis设置有相互的SSL,但是对于我的用例来说,双向身份验证没有任何好处。由于我的设置不起作用,我再次添加了它,但我认为它只是强制客户端通过用户/密码进行身份验证。