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 パーサーと思われるため、必要です。