多线程 Ruby 程序仅使用 100% CPU



我正在使用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 将具有真正的并行线程,而不是实际的发布信息。是时候切换到杰鲁比了...

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

特别:

  • MRI在解释器中将Ruby线程实现为绿色线程,并自行调度它们;它不能一次调度多个线程,也不能将它们调度到多个CPU。
  • YARV 将 Ruby 线程实现为本机操作系统线程(POSIX 线程或 Windows 线程(,并让操作系统调度它们,但它在它们周围放置了一个巨大的虚拟机锁 (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 上运行

我对黄玉、红衣主教、磁悬浮、MRuby 和所有其他公司都不够了解。

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

在此处查看类似问题

最新更新