1

herokuにデプロイされたレールアプリがあります。7 つのマネージャー オブジェクト (タスクごとに 1 つ) を連続して作成し、無限ループでそれらのメソッドを実行する 1 つのワーカー (jobs:work) があります。これはメインコードがどのように見えるかです (とにかくその重要な部分):

loop do
  begin
    Manager.subclasses.each do |manager_klass|
      manager_klass.new.process
    end
  #exception handling here
  end
  sleep(1)
end

Model.all などのようなことを行うタスクはありません。ruby のリークと肥大化に関する多くの記事を読み、それらのほとんどを避けてきました。

ワーカーの Heroku ログには次のものが含まれます。R14 - メモリ クォータを超えました。

これは、約 3 時間のワーカー実行後に表示され始めます (これは、メモリ リーク/メモリ蓄積の実質的な証拠です)。

私は memprof (ruby 1.9 では動作しません)、bleak_house (関連のない情報を靴に入れる)、および Linux コマンドを使用してメモリ スナップショットをログに記録する他の gem (heroku では動作しません) を試しました。

これに関するstackoverflowのすべての回答を見てきましたが、何の助けにもなりません。

1 つの仕事で 7 人のマネージャーが働いているという私の特定のケースについて何かアイデアはありますか?

4

1 に答える 1

0

メモリ使用量を確認するには、https ://devcenter.heroku.com/articles/log-runtime-metrics を試してください。これも参照してください https://blog.heroku.com/archives/2013/3/19/log2viz 合わせて、メモリリークを確認できます。

別のバージョンの Ruby は役に立ちますか?

また、いわば「サブワーカー」を作成するのはなぜですか? あなたの労働者は十分に活用されていませんか?そのように7つのジョブを同時に処理する必要がありますか(ワーカーを増やす代わりに)。

于 2013-07-15T18:11:03.097 に答える