2016-05-06 5 views
1

私は、ResqueとResqueスケジューラを備えたHerokuのRails 4アプリケーションをそれぞれ別の1xダイノスで実行しています。私は現在、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 

私は私webダイノだけ消費している間にアイドルで、私のresqueダイノは、使用可能なメモリの512メガバイトの390メガバイトを消費していることがわかりますメモリ使用量をプロファイリングする場合262MBのメモリ。一見すると、私は十分な頭の部屋があるので、これは大丈夫と思われる。

しかし、resqueダイノで送信される電子メールを40個キューに入れると、メモリ使用量は最大480MBになります。私がキューに入れると、それはdynoの容量を超えるまで増加し、R14エラーが発生します。私はSendGrid APIを使って電子メールを送信するのではなく、SMTP経由で送信するわけではありませんが、まだ電子メールテンプレートrender_to_string(それより効率的な方法を探しています)が必要です。

私が知りたいのは、Herokuのリソース消費を最適化するための最良の方法は何ですか?私はResqueを主に画像処理とバッチ電子メールの送信に使用します。私は現在、3人の労働者を1つのdynoにスピンアップさせていますが、私は1人のdynoに複数の人員を置くべきか、ほとんどの場合、アプリの現在の使用率はかなり低くなっていますが、近い将来に使用量が大幅に増加し、スケーリングが懸念されています。たとえば、今は1日に1人のユーザーに一度に100枚の写真を一括アップロードしたり、一度に50のメールを送信したりすることができます。私はすぐに使用量の10倍の増加を予期しています。

私は具体的な回答そのものを探しているわけではなく、リソースの使用状況を最適化してスムーズにスケールアップする方法についてアドバイスしています。ありがとう!リーク作業者のメモリオーバヘッドを低減するために、リキュープールを利用することについては、

答えて

1

Heroku did a nice write-upである。

resque-pool gemは、dynoごとに複数のワーカーを実行することによってresqueベースのワーカーをスケールアウトします。 resque-pool gemは、Unicorn Webサーバーと同様に動作します。 1つのマスタープロセスを起動し、unix forkコマンドを使用して、データをすべて独立して処理できる複数のresqueワーカーを作成します。これらの複数の労働者はあなたの「プール」を作ります。並行処理のためのプロセスの使用はRubyではより安全ですが、より高いメモリオーバーヘッドを持つことができます。

この宝石の使い方は、Herokuエコシステムの外にあるresque労働者にも適用されます。

関連する問題