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 下,线程比 fork 便宜得多,并且应该会显着提高性能。

也就是说,一旦 Ruby 2.0 提供了对 CoW 友好的内存 GC 模型,Resque 应该会更具竞争力。但是,至少在几个季度内不会发生这种情况。

于 2012-10-20T22:08:13.603 回答