【问题标题】:Multithreaded system calls in RubyRuby 中的多线程系统调用
【发布时间】:2012-10-11 04:20:43
【问题描述】:

我有一个使用 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 是多线程的?
  • @DanielCukier Resque 不是多线程,它在内部使用 fork

标签: ruby multithreading system system-calls sidekiq


【解决方案1】:

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

因为这个问题,很多人已经转而使用Sidekiq 作为替代方案。在 Ruby 1.9 下,线程比 fork 便宜得多,并且应该会显着提高性能。

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

【讨论】:

  • 实际上,我搞错了:我已经在使用 sidekiq :-) 仍然遇到性能问题
  • “CoW”的意思是“写时复制”,而不是“工作站集群”,对吧?
猜你喜欢
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多