31

JSONクロールを実行する約6つのSidekiqワーカーがあります。エンドポイントのデータセットのサイズに応じて、1 分から 4 時間で終了します。特に、4時間かかる長いものを見ると、時間の経過とともにメモリがわずかに増加することがわかります.

同じワーカー ジョブを再度スケジュールするまでは問題ありません。Sidekiq プロセスを削除する Linux OOM Killer に遭遇するまで、メモリの割り当てが解除されず、積み重なっていきます。

メモリリーク?ObjectSpace 内のさまざまなオブジェクトの数を確認しました。

ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }

実際には増加はありません。ハッシュ、配列などのセットは同じままです。短い増加はガベージ コレクターによって一掃され、ガベージ コレクターもgc.stat[:count]機能していることがわかります。

[Done]がログに記録され、ビジー状態のワーカーがなくなったなど、ワーカーが終了した後でも、メモリの割り当ては解除されません。その理由は何ですか?これに対して何かできることはありますか?ファイナライザーを作成しますか?

現在の唯一の解決策: Sidekiq プロセスを再起動します。

私は Ruby 2.0.0 を使用しており、Ruby MRI を使用しています。


JSON の解析にはYajlを使用するため、C バインディングを使用します。ストリーミングされた読み取りと書き込みを適切に実装する唯一の高速 JSON パーサーと思われるため、必要です。

4

1 に答える 1