我已经通过cat /proc/cpuinfo
找到了“Most unixes”的解决方案,但是纯Ruby解决方案会更好。
答案 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()
类型的电话。
您可能只需要动态检测您正在使用的平台:
/proc/cpuinfo
“文件”;或最后一行可以使用:
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)
在Mac上:
thiago-pradis-macbook:~tchandy $ hwprefs cpu_count
2
答案 9 :(得分: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
答案 10 :(得分: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事实。
答案 11 :(得分: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)