如何确定在Heroku Performance dyno上运行的Puma工作者和线程的正确数量?

时间:2016-11-02 06:02:50

标签: ruby-on-rails multithreading heroku puma

我已经阅读了Heroku关于Puma和dyno类型的所有文章,我无法得到直接答案。

我看到一些人提到Puma工人的数量应该由核心数决定。我无法找到Heroku显示性能-M或性能-L dyno具有多少核心的任何地方。

在这篇文章中,Heroku暗示了一种方法: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server

我认为他们建议将线程设置为1并增加Puma工作者的数量,直到您开始看到R14(内存)错误,然后退出。然后增加线程数,直到CPU最大化,但我不认为Heroku报告CPU利用率。

任何人都可以提供指导吗?

(我还想决定是否应该使用一个性能-L或多个性能-M dynos,但我认为一旦我弄清楚如何设置工人和线程就会很清楚)

2 个答案:

答案 0 :(得分:9)

我目前想出的路线图如下:

  1. heroku run "cat /proc/cpuinfo" --size performance-m --app yourapp
  2. heroku run "cat /proc/cpuinfo" --size performance-l --app yourapp
  3. 记下您的流程信息
  4. 搜索模型类型,系列,型号,英特尔处理器的步数,以及查找此处理器具有或模拟的核心数。
  5. 看看这个https://devcenter.heroku.com/articles/dynos#process-thread-limits
  6. 使用standard-2X / standard-1X进行一些小型实验,以确定PUMA_WORKER值。
  7. 你的数学是这样的:
  8. (Max Threads of your desired dyno type could support) / (Max Threads of baseline dyno could support) x (Your experiment `PUMA_WORKER` value on baseline dyno) - (Number of CPU core)

    例如,如果我的PUMA_WORKER dyno上的standard-2X为3,那么PUMA_WORKER上的performance-m号码我会开始测试它:

    16384/512 * 3 - 4 = 92

    您还应该考虑应用消耗多少内存并选择最低内存。

    编辑:以前我的答案是在ps:exec可用之前编写的。你可以阅读the official document并学习如何运行dyno(s)。它应该比以前容易得多。

答案 1 :(得分:0)

目前在 AWS 生产中运行的应用程序面临同样的问题(我们正在使用 ECS),并试图定义两者之间的良好匹配:

  • 每个实例的 vCPU/Ram 数量
  • 实例数量
  • 每个实例运行的 puma_threads 数量(每个实例有一个 puma 进程)

为了更好地了解我们的应用程序如何使用 puma_threads 池,我们执行了以下操作:

  • 将 puma 指标导出到 cloudwatch(线程运行 + 积压),然后我们看到大约 15 个并发线程,积压开始增加。
  • 将其与 vCPU(使用情况)进行比较,我们发现我们的 vCPU 从未超过 25%

结合使用这两个信息,我们决定采取上述行动。

最后我想分享一下this article,我发现这个话题很有趣。