0

sidekiq を使用して一部の処理をキューに送信するシステムがあります。これらのプロセスは、画像を操作するプログラムに対してシステム コールを実行することで構成されます。このプログラムのパフォーマンスは非常に悪いです。システムを「トップ」にすると、ほとんどすべての CPU が Ruby によって消費され、イメージ ソフトウェアによってわずかな CPU が消費されます。

5、10、20、30 人のワーカーでテストしようとしました。ワーカーを追加しても処理パフォーマンスは向上しません (値が大きいとさらに悪化します)。

私の労働者は次のようなものです:

def perform(file)
    command = "convert -strip -resize 580x580 -quality 90 -sampling-factor 4:2:0 -interlace Plane #{file} #{file}.main"
    `#{command}`
end

Ruby でマルチスレッド システム コールを改善する方法はありますか?

4

1 に答える 1

1

残念ながら、問題は Resque のコア デザインです。フォーク ワーカー モデルを使用し、Ruby 1.9 は CoW に対応していないため、各サブプロセスで最初に GC を呼び出すと、そのプロセス全体のメモリ空間の完全なコピーが作成されます。これは遅いです。

特にこの問題のために、多くの人が代替手段としてSidekiqに移行しました。スレッドは、Ruby 1.9 でのフォークよりもはるかに安価であり、パフォーマンスが大幅に向上するはずです。

とはいえ、Ruby 2.0 に CoW フレンドリーなメモリ GC モデルが搭載されれば、Resque の競争力は大幅に向上するはずです。しかし、少なくとも数四半期はそうはなりません。

于 2012-10-20T22:08:13.603 に答える