【问题标题】:Optimizing memory usage for Resque优化 Resque 的内存使用
【发布时间】:2016-09-01 15:52:59
【问题描述】:

我在 Heroku 上有一个 Rails 4 应用程序,带有 Resque 和 Resque Scheduler,每个应用程序都在单独的 1x dyno 上运行。我目前有 3 名 Resque 工作人员启动。

这是我的Procfile供参考:

web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
resque: env TERM_CHILD=1 RESQUE_TERM_TIMEOUT=7 bundle exec rake resque:workers QUEUE='*' COUNT='3'
scheduler: bundle exec rake resque:scheduler

当我分析内存使用情况时,我可以看到在空闲时,我的resque dyno 消耗了 512MB 的可用内存中的 390MB,而我的web dyno 只消耗了 262MB 的内存。乍一看,这似乎没问题,因为我有足够的头部空间。

但是,当我在 resque dyno 上排队发送 40 封电子邮件时,内存使用量飙升至 480MB。如果我排队更多,它会增长,直到超过测功机的容量并且我收到 R14 错误。请注意,我没有使用 SendGrid API 而不是通过 SMTP 发送电子邮件,但我仍然必须 render_to_string 每个电子邮件模板(为此寻找更有效的路线),我怀疑这是消耗了很多记忆。

我想知道在 Heroku 上优化资源消耗的最佳方法是什么?我使用Resque 主要用于图像处理和发送批量电子邮件。我目前有 3 名工人在一台测功机上旋转,但我不确定我是否应该在一台测功机上使用更多或更少的工人,或者分散在多个测功机上。大多数情况下,该应用程序的当前使用量相当低,但我预计在不久的将来使用量会大大增加,因此我担心扩展。例如,现在我可能有一个用户每天一次批量上传 100 张照片,或者一次发送 50 封电子邮件。不过,我预计使用量很快会增加 10 倍。

我本身并不是在寻找具体的答案,只是关于如何优化我的资源使用并顺利扩展的建议。谢谢!

【问题讨论】:

    标签: ruby-on-rails memory heroku scalability resque


    【解决方案1】:

    Heroku did a nice write-up 谈如何利用 resque-pool 来减少 resque worker 的内存开销。

    resque-pool gem 通过在每个测功机上运行多个工作人员来扩展基于 resque 的工作人员,非常适合。 resque-pool gem 的设计方式类似于 Unicorn Web 服务器。它启动一个主进程,然后使用 unix fork 命令创建多个可以独立处理数据的 resque worker。这些多个 resque 工作人员创建了您的工作人员“池”。在 Ruby 中使用并发进程更安全,但可能会产生更高的内存开销。

    这个 gem 的使用也适用于在 Heroku 生态系统之外运行 resque worker。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 2014-05-05
      • 2011-03-09
      • 2015-11-22
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多