多线程ruby程序仅使用100%cpu

时间:2013-10-09 21:40:01

标签: ruby multithreading

我正在使用ruby-head和Debian wheezy x64。当我运行多线程ruby脚本时,htop显示它在视觉上使用多个核心,顶部有条形图,并且它在进程列表中使用100%CPU,但它仅使用100%的一个核心容量。我认为可能有多个内核以100%运行,这个数字似乎太方便了,无法通过程序逻辑或其他硬件方面进行瓶颈。操作系统是否限制了我正在使用的可用指令的数量,如果是这样,我该怎么做呢?

编辑更多信息:

当我的意思是在视觉上使用多个核心时,例如:47%核心1,29%核心2和24%核心3.这些百分比不断上下移动到不同的核心集合,但总是总共加起来100 %-102%。使用的核心数超过3个(总共/ 8个),但除了三个核心以外的任何核心仅使用2%或更少的容量。我想我还应该提一下这是一个linode VPS。

编辑:

好吧,看起来我正在阅读承诺2.0将具有真正的并行线程,而不是实际的发布信息。是时候改用Jruby ......

2 个答案:

答案 0 :(得分:10)

您没有提到您正在使用的Ruby实现。并非所有Ruby实现都能够将Ruby线程调度到多个CPU。

特别是:

  • MRI将Ruby线程实现为解释器中的绿色线程并自行调度它们;它不能一次安排多个线程,也无法将它们安排到多个CPU
  • YARV将Ruby线程实现为本机操作系统线程(POSIX线程或Windows线程),并允许操作系统安排它们,但是它会围绕它们放置一个巨型VM锁(GVL),以便在任何给定的情况下只能运行一个Ruby线程时间
  • Rubinius将Ruby线程实现为本机操作系统线程(POSIX线程或Windows线程),并允许操作系统安排它们,但是它会围绕它们设置全局解释器锁(GIL),以便在任何给定的情况下只能运行一个Ruby线程时间; Rubinius 2.0将具有细粒度的锁,以便可以在任何给定时间运行多个Ruby线程
  • JRuby将Ruby线程实现为JVM线程,并使用细粒度锁定,以便可以运行多个线程;但是,这些线程是否被安排到多个CPU取决于所使用的JVM,有些允许这样做,有些人不这样做
  • IronRuby将Ruby线程实现为CLI线程,并使用细粒度锁定,以便可以运行多个线程;但是,这些线程是否被安排到多个CPU取决于所使用的VES,有些允许这样做,有些人不会
  • MacRuby将Ruby线程实现为本机操作系统线程,并使用细粒度锁定,以便多个线程可以同时在多个CPU上运行

我对Topaz,Cardinal,MagLev,MRuby以及其他所有人都不太了解。

答案 1 :(得分:4)

MRI在其解释器中将Ruby Threads实现为绿色线程。不幸的是,它不允许并行调度这些线程,它们一次只能运行一个线程。

查看类似问题here