Ruby中的多线程系统调用

时间:2012-10-20 22:02:25

标签: ruby multithreading system system-calls sidekiq

我有一个使用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中改进多线程系统调用?

1 个答案:

答案 0 :(得分:1)

不幸的是,问题是Resque的核心设计。因为它使用了forking worker模型,并且因为Ruby 1.9不是CoW友好的,所以每个子进程中的第一次GC调用会产生整个进程内存空间的完整副本。这很慢。

许多人已经转移到Sidekiq作为替代,特别是因为这个问题。在Ruby 1.9下,线程比fork更便宜,并且应该可以显着提高性能。

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