Ruby 检测已安装的CPU数量

Ruby 检测已安装的CPU数量,ruby,Ruby,我已经通过cat/proc/cpuinfo找到了“大多数Unix”的解决方案,但是纯Ruby解决方案会更好。当然,如果你能cat它,你可以使用该语言的标准功能打开、阅读和关闭它,而不必求助于system()类型调用 您可能只需要动态检测您所处的平台,或者: 为Linux使用/proc/cpuinfo“文件”;或 与Windows的WMI通信 最后一行可以使用: require 'win32ole' wmi = WIN32OLE.connect("winmgmts://") info = wm

我已经通过
cat/proc/cpuinfo
找到了“大多数Unix”的解决方案,但是纯Ruby解决方案会更好。

当然,如果你能
cat
它,你可以使用该语言的标准功能打开、阅读和关闭它,而不必求助于
system()
类型调用

您可能只需要动态检测您所处的平台,或者:

  • 为Linux使用
    /proc/cpuinfo
    “文件”;或
  • 与Windows的WMI通信
最后一行可以使用:

require 'win32ole'
wmi = WIN32OLE.connect("winmgmts://")
info = wmi.ExecQuery ("select * from Win32_ComputerSystem")

然后使用info的项。

对于JRuby,您可以使用以下Java代码检查它:

 Runtime runtime = Runtime.getRuntime();   
 int numberOfProcessors = runtime.availableProcessors(); 

编辑:现在rails附带了并发ruby作为依赖项,所以它可能是最好的解决方案

$ gem install concurrent-ruby
$ irb
irb(main):001:0> require 'concurrent'
=> true
irb(main):002:0> Concurrent.processor_count
=> 8
irb(main):003:0> Concurrent.physical_processor_count
=> 4
有关更多信息,请参阅。因为它同时具有物理核和逻辑核,所以它比内置的
等处理器
要好

这是前面的答案

$ gem install facter
$ irb
irb(main):001:0> require 'facter'
=> true
irb(main):002:0> puts Facter.value('processors')['count']
4
=> nil
irb(main):003:0> 
如果您还想了解系统的其他信息,这是最好的,因为它不是特定于平台的,并且设计用于完成这项工作

更新:更新内容包括Nathan Kleyn关于api变更的提示。

关于Mac:

thiago pradis macbook:~tchandy$hwprefs cpu\u计数


2

以下是针对Linux、OSX、Windows和BSD的实现:

源代码:

module System
  extend self
  def cpu_count
    return Java::Java.lang.Runtime.getRuntime.availableProcessors if defined? Java::Java
    return File.read('/proc/cpuinfo').scan(/^processor\s*:/).size if File.exist? '/proc/cpuinfo'
    require 'win32ole'
    WIN32OLE.connect("winmgmts://").ExecQuery("select * from Win32_ComputerSystem").NumberOfProcessors
  rescue LoadError
    Integer `sysctl -n hw.ncpu 2>/dev/null` rescue 1
  end
end

System.cpu_count # => 2

我目前正在使用它,它涵盖了所有操作系统。

@格罗瑟:

when /linux/ `grep -c processor /proc/cpuinfo`.to_i 当/linux/ `grep-c处理器/proc/cpuinfo`.to_i

我最近发现了一些可能需要考虑的问题。您可以停用处理器(使其脱机),然后facter Processor Count(加上上面的一些其他方法)给出错误的结果。只要操作正确,就可以在/proc/cpuinfo中计算处理器行数。如果您只是用进程的索引号填充一个数组,如果进程中存在间隙(如,进程0、1、2、10、11、12处于活动状态,所有其他进程到20都处于非活动状态),它将自动使索引3-9存在(某种程度上),在这种情况下,至少数组大小将报告13。您必须进行压缩才能获得活动处理器的数量。然而,如果您想要总体处理器,最好查看/sys/devices/system/cpu[0-9],并将其计算在内。这将给出处理器的总数,而不是有多少(或哪些)处于活动状态


只是想一想。我试图通过facter补丁添加activeprocessorcount和totalprocessorcount事实。

我尝试使用
facter
,但发现速度有点慢。我尝试了
system
gem,发现速度快了很多。它也很容易使用:
System::CPU.count

结合@grosser和@paxdiablo的答案,因为在我的系统(winxp)上,win32\u计算机系统没有任何处理器信息;不过,这是可行的:

require 'win32ole'
wmi = WIN32OLE.connect("winmgmts://")
info = wmi.ExecQuery ("select NumberOfCores from Win32_processor")
puts info.to_enum.first.NumberOfCores
要查看您的系统上有哪些可用功能,请从运行以下命令(在本例中我使用了1.0):


(如果你已经安装了cygwin,可能想通过管道连接到grep)

在linux中,你也可以使用
nproc
,这比其他基于子shell的解决方案更干净。我想让vagrant给虚拟机提供与主机相同数量的CPU。我将此添加到了Vagrant文件:

vb.cpus = `nproc`.to_i

从Ruby版本2.2.3开始,Ruby的stdlib中的模块提供了一个返回处理器数量的方法。需要注意的是,如果ruby被降级为CPU核心的子集,
Etc.nProcessor
将只返回ruby可以访问的核心数量。此外,如前所述,这将只返回虚拟核而不是物理核,这可能会导致预期值的差异

require 'etc'
p Etc.nprocessors #=> 4

或者可能是多个处理器。;-)谢谢,我希望这是件容易的事情,因为现在我将跳过这个功能:)很好的解决方案,我来看看,因为我在一个公共图书馆工作,我不想为这些琐碎的东西添加一个额外的依赖项。对于那些来这里想知道为什么
Facter.sp_number_处理器在最新版本中不工作的人,请尝试使用
Facter.processorcount
Facter.processorcount
表示我的Macbook Air双核Intel i5有4个处理器<代码>#sp_编号(处理器
正确显示为2。您可以使用
Facter.list
查看您机器的所有可用事实。我无法让Facter gem在运行Rails 4的Windows上运行。首先:无法加载win32/dir,但“gem安装win32 dir”修复了该问题。现在:无法加载windows/system_信息,我找不到合适的gem来解决这个问题。新的facter文档没有任何帮助。@ryanttb,facter API发生了巨大的变化。此外,既然Ruby1.9+无处不在,就不需要显式地包含RubyGems。我建议进行编辑,但如果您需要,请尝试
Facter.value('processors')['count']
。我之所以支持这一点,特别是因为有了JRuby,您实际上可以在Ruby的线程类中使用这些额外的内核!是否也值得添加此版本的示例?#/usr/bin/jruby include Java puts“您有#{Java.lang.Runtime.getRuntime.AvailableProcessor}内核”如果您复制并粘贴此方法,您还需要拉取
hwprefs\u available
方法,或者更好,需要gem并调用
Parallel.processor_count
Parallel
库已更新,
processor_count
方法现在需要注意的是,NumberOfCores只提供系统中一个CPU的物理内核数。您必须将其乘以CPU的数量(请参见下面的Konstantin Haases答案)…不幸的是,它返回的是虚拟内核而不是物理内核,并且没有一种方法在
Etc
上获取物理内核。感谢您的提醒@seanlinsley。我编辑了我的答案,让它更清晰。这对我来说非常有用。肯定会返回虚拟内核,但在某些情况下,这正是您想要的。例如,我有一个四核超读MacBookPro和这个
vb.cpus = `nproc`.to_i
require 'etc'
p Etc.nprocessors #=> 4