我在Heroku上有一个Rails 4应用程序,Resque和Resque Scheduler分别运行在不同的1x dynos上。我目前有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消耗了390MB的512MB可用内存,而我的web
dyno只消耗了262MB的内存。乍一看这似乎没问题,因为我有足够的头部空间。
当我在resque
dyno上排队发送40封电子邮件时,内存使用率最高可达480MB。如果我排队更多,它会增长,直到它超过dyno的容量,我得到一个R14错误。请注意,我没有使用SendGrid API而不是通过SMTP发送电子邮件,但我仍然需要render_to_string
每个电子邮件模板(寻找更有效的路线),这是我怀疑的消耗大量内存。
我想知道最好的方法是如何优化Heroku上的资源消耗?我使用Resque
主要用于图像处理和发送批量电子邮件。我目前有3名工作人员在一个dyno上旋转,但我不确定我是应该在一个dyno上拥有更多或更少的工作人员,还是分布在多个dyno上。大多数时候,应用程序的当前使用率相当低,但我预计在不久的将来使用量会大大增加,因此我担心缩放。例如,现在我可能每天有一个用户批量上传100张照片,或者一次发送50封电子邮件。我预计很快就会增加10倍的使用量。
我本身并没有寻找具体的答案,只是建议如何优化我的资源使用情况并顺利扩展。谢谢!
答案 0 :(得分:1)
Heroku did a nice write-up关于利用resque-pool来减少resque worker的内存开销。
resque-pool gem通过每个dyno运行多个工作人员来扩展您的resque-based工作者,并且非常适合。 resque-pool gem的行为与Unicorn Web服务器的设计方式类似。它引导一个主进程,然后使用unix fork命令创建多个可以独立处理数据的resque worker。这些多个resque工作者创建了你的“工作池”。使用并发进程在Ruby中更安全,但可能会有更高的内存开销。
此gem的使用也适用于在Heroku生态系统之外运行resque worker。