4

我正在使用 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 了……

4

2 回答 2

10

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

尤其是:

  • MRI 将 Ruby 线程实现为解释器内部的绿色线程并自行调度它们;它一次不能调度多个线程,也不能将它们调度到多个 CPU
  • YARV 将 Ruby 线程实现为本地 OS 线程(POSIX 线程或 Windows 线程)并让 OS 调度它们,但是它在它们周围放置了一个巨型 VM 锁 (GVL),因此在任何给定时间只能运行一个 Ruby 线程
  • Rubinius 将 Ruby 线程实现为本地 OS 线程(POSIX 线程或 Windows 线程)并让 OS 调度它们,但是它在它们周围放置了一个全局解释器锁 (GIL),因此在任何给定时间只能运行一个 Ruby 线程;Rubinius 2.0 将拥有细粒度锁,以便多个 Ruby 线程可以在任何给定时间运行
  • JRuby 将 Ruby 线程实现为 JVM 线程,并使用细粒度锁定,以便可以运行多个线程;但是,这些线程是否被调度到多个 CPU 取决于所使用的 JVM,有些允许这样做,有些则不允许
  • IronRuby 将 Ruby 线程实现为 CLI 线程,并使用细粒度锁定,以便可以运行多个线程;但是,这些线程是否被调度到多个 CPU 取决于所使用的 VES,有些允许这样做,有些则不允许
  • MacRuby 将 Ruby 线程实现为原生 OS 线程并使用细粒度锁定,以便多个线程可以同时在多个 CPU 上运行

我对 Topaz、Cardinal、MagLev、MRuby 和所有其他人知之甚少。

于 2013-10-10T00:15:20.457 回答
4

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

在此处查看类似问题

于 2013-10-09T21:51:20.903 回答