Ruby中的多线程系统调用

Ruby中的多线程系统调用,ruby,multithreading,system,system-calls,sidekiq,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-fa

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

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

正是因为这个问题,许多人选择了另一种方式。在Ruby 1.9中,线程比fork便宜得多,应该会显著提高性能


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

你怎么会认为Resque是多线程的?@DanielCukier Resque不是多线程的,它使用的是
fork
实际上,我在内部制造了一个混乱:我已经在使用sidekiq:-)并且仍然存在性能问题“CoW”意思是“写时拷贝”,而不是“工作站集群”,对吗?