检测安装的CPU数量

时间:2009-05-21 05:42:49

标签: ruby

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

12 个答案:

答案 0 :(得分:37)

编辑:现在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

有关详情,请参阅http://ruby-concurrency.github.io/concurrent-ruby/root/Concurrent.html。因为它同时具有物理和逻辑核心,所以它比内置的Etc.nprocessors更好。

这是以前的答案;

$ 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> 

这个facter gem是最好的,如果你也想要关于系统的其他事实,它不是特定于平台的,并且旨在做到这一点。

更新:更新以包括Nathan Kleyn关于api更改的提示。

答案 1 :(得分:33)

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

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

答案 2 :(得分:26)

我目前正在使用它,它涵盖了所有操作系统。 https://github.com/grosser/parallel/blob/master/lib/parallel.rb#L63

  def self.processor_count
    case RbConfig::CONFIG['host_os']
    when /darwin9/
      `hwprefs cpu_count`.to_i
    when /darwin/
      ((`which hwprefs` != '') ? `hwprefs thread_count` : `sysctl -n hw.ncpu`).to_i
    when /linux/
      `cat /proc/cpuinfo | grep processor | wc -l`.to_i
    when /freebsd/
      `sysctl -n hw.ncpu`.to_i
    when /mswin|mingw/
      require 'win32ole'
      wmi = WIN32OLE.connect("winmgmts://")
      cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this
      cpu.to_enum.first.NumberOfCores
    end
  end

答案 3 :(得分:11)

使用JRuby,您可以使用以下Java代码进行检查:

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

答案 4 :(得分:9)

以下是Linux,OSX,Windows和BSD的实现:https://gist.github.com/1009994

源代码:

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

答案 5 :(得分:5)

当然,如果你能cat它,你可以使用该语言的标准功能打开,阅读和关闭它,而无需诉诸system()类型的电话。

您可能只需要动态检测您正在使用的平台:

  • 对Linux使用/proc/cpuinfo“文件”;或
  • 与WMI for Windows进行通信。

最后一行可以使用:

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

然后使用info的NumberOfProcessors项。

答案 6 :(得分:3)

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

答案 7 :(得分:3)

在linux中,您还可以使用nproc,这比其他基于子shell的解决方案更清晰。我希望vagrant能够像主机那样为虚拟机提供相同数量的CPU。我将其添加到Vagrantfile

vb.cpus = `nproc`.to_i

答案 8 :(得分:1)

@grosser:

when /linux/  
  `grep -c processor /proc/cpuinfo`.to_i

http://www.partmaps.org/era/unix/award.html#cat
http://www.partmaps.org/era/unix/award.html#wc

答案 9 :(得分:1)

在Mac上:

thiago-pradis-macbook:~tchandy $ hwprefs cpu_count

2

答案 10 :(得分:0)

@ grosser&和@ paxdiablo的答案的组合,因为在我的系统(winxp)win32_computersystem上没有任何处理器信息;这虽然有效:

require 'win32ole'
wmi = WIN32OLE.connect("winmgmts://")
info = wmi.ExecQuery ("select NumberOfCores from Win32_processor")
puts info.to_enum.first.NumberOfCores

要查看您系统上可用的内容,请从powershell运行此操作(在本例中我使用1.0):

Get-WmiObject -list

(如果您已经安装了cygwin,可能想要使用grep)

答案 11 :(得分:0)

我最近发现了一些可能需要考虑的事情。您可以取消激活处理器(使它们脱机),然后facter processorcount(以及上面的一些其他方法)给出错误的结果。只要正确执行,您就可以计算/ proc / cpuinfo中的处理器行数。如果你只是用一个procs的索引号填充一个数组,如果你在procs中有间隙(如在,procs 0,1,2,10,11,12是活动的,所有其他的20个说是不活动的),它将自动弹出索引3-9(有点),在这种情况下,至少Array#size将报告13。您必须执行#compact才能获得活动处理器的数量。但是,如果你想要总处理器,或许更好的是查看/ sys / devices / system / cpu [0-9],并计算一下。这将为您提供处理器的总数,但不会为您提供多少(或哪些)处理器。

需要考虑的事情。我试图通过修补程序来添加一个activeprocessorcount和totalprocessorcount事实。