2016-05-06 49 views
1

我在Heroku上使用Rails 4應用程序,並使用Resque和Resque Scheduler,每個應用程序在單獨的1x dynos上運行。我目前有3名Resque員工旋轉起來。爲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賽道被消耗可用內存512MB的390MB,而我的web賽道僅消耗內存262MB。乍看之下,這似乎確定,因爲我有足夠的空間。

當我排隊40級的郵件要在resque賽道雖然送出,內存使用率峯值可達480MB。如果我排隊更多,它會增長,直到它超出測功機的容量,並且出現R14錯誤。請注意,我不是使用SendGrid API而是通過SMTP發送電子郵件,但我仍然需要爲每個電子郵件模板render_to_string(爲此尋找一條更有效的路線),這是我懷疑會消耗大量內存的原因。

我想知道什麼是最好的辦法就是在這裏以優化在Heroku我的資源消耗?我主要使用Resque進行圖像處理併發送批量電子郵件。我目前有三名工人在一臺測功機上旋轉,但我不確定我是否應該在一臺測功機上安裝更多或更少的工人,或者分佈在多臺測功機上。目前該應用程序的使用情況在大多數時間都很低,但我預計在不久的將來使用量會大幅增加,因此我們擔心縮放問題。例如,現在我可能每天有一位用戶批量上傳100張照片,或一次發送50封電子郵件。儘管如此,我預計使用量會增加10倍。

我不是在尋找一個明確的答案本身,如何優化我的資源使用情況,順利擴大隻是建議。謝謝!

回答

1

Heroku did a nice write-up上利用resque池,以減少resque工人的內存開銷。

resque-pool gem通過爲每個動態定位器運行多個工作人員來擴展基於resque的工作人員,並且非常合適。 resque-pool gem的行爲與Unicorn web服務器的設計方式類似。它啓動一個主進程,然後使用unix fork命令創建多個可以獨立處理數據的resque worker。這些復員工人創造你的「工作人員」池。在Ruby中使用併發處理更安全,但可能會有更高的內存開銷。

此gem的用法也適用於在Heroku生態系統之外運行resque工作者。