【问题标题】:Multithreaded ruby program only uses 100% cpu [duplicate]多线程 ruby​​ 程序仅使用 100% cpu [重复]
【发布时间】:2013-10-17 11:24:04
【问题描述】:

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

【问题讨论】:

    标签: ruby multithreading


    【解决方案1】:

    您没有提及您使用的是哪个 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 和所有其他人知之甚少。

    【讨论】:

      【解决方案2】:

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

      查看类似问题here

      【讨论】:

      • 我认为 ruby​​ 2.0 解决了这个问题。此外,我不确定您的回答是否有意义,因为我清楚地看到操作系统显示正在使用的多个内核。
      • 不,ruby 中的global interpreter lock 需要做很多工作才能兼容真正的多线程。
      • 啊,对不起。看起来我只是在阅读该功能的承诺。是时候改用 Jruby了。
      • 由于格式错误,@rudolph9 提供给 global interpreter lock 的链接是 404。此评论包含固定链接。
      • @Excalibur 感谢您让我知道我会更新我的帖子。
      猜你喜欢
      • 2018-05-04
      • 2014-05-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      相关资源
      最近更新 更多