Определить количество установленных ЦП

Я уже нашел решение для "Большинство unixes" через cat /proc/cpuinfo, но решение pure-Ruby было бы лучше.

Ответ 1

В настоящее время я использую это, которое охватывает все ОС. 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

Ответ 2

EDIT: теперь рельсы поставляются с одновременным рубином в качестве зависимости, поэтому, возможно, это лучшее решение;

$ 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 для получения дополнительной информации.

и вот предыдущий ответ;

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

Этот драгоценный камень факера является лучшим, если вы хотите получить другие факты о системе, это не специфичная для платформы и предназначенная для этой цели.

UPDATE: обновлено, чтобы включить подсказку Nathan Kleyn об изменении api.

Ответ 3

В версии Ruby версии 2.2.3 модуль etc в Ruby stdlib предлагает nprocessors, который возвращает количество процессоров. Следует отметить, что если рубин будет отнесен к подмножеству ядер процессора, Etc.nprocessors вернет только число ядер, к которым имеет доступ Ruby. Кроме того, как отмечалось в seanlinsley, это приведет к возврату виртуальных ядер вместо физических ядер, что может привести к несоответствию ожидаемого значения.

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

Ответ 4

с JRuby вы можете проверить его со следующим кодом Java:

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

Ответ 5

Вот реализация для 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

Ответ 6

Конечно, если вы можете cat его, вы можете открывать, читать и закрывать его, используя стандартные функции языка, не прибегая к вызову system().

Вам просто нужно определить, на какой платформе вы находитесь динамически, и либо:

  • используйте /proc/cpuinfo "файл" для Linux; или
  • взаимодействует с WMI для Windows.

Эта последняя строка может использовать:

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

Затем используйте информацию элемент NumberOfProcessors.

Ответ 7

В linux вы также можете использовать nproc, который чище, чем другие решения на основе подоболочек. Я хотел, чтобы бродяга отдавал такое же количество процессоров виртуальной машине, что и хост. Я добавил это к Vagrantfile:

vb.cpus = `nproc`.to_i

Ответ 8

Я попытался использовать Facter, но нашел это немного медленным. Я попробовал драгоценный камень system и нашел его намного быстрее. Он также очень прост в использовании: System::CPU.count.

Ответ 9

на Mac:

thiago-pradis-macbook: ~ tchandy $hwprefs cpu_count

2

Ответ 11

Недавно я нашел кое-что, что, возможно, нужно принять во внимание. Вы можете деактивировать процессоры (взять их в автономном режиме), а затем facter processorcount (плюс некоторые другие методы выше) дает неправильный результат. Вы можете подсчитать процессорные строки в /proc/cpuinfo, если вы делаете это правильно. Если вы просто заполняете массив номерами индексов procs, если у вас есть пробелы в procs (как и в, procs 0,1,2,10,11,12 активны, все остальные до 20 говорят неактивно), это будет автоматически spring индексы 3-9 в существование (вроде), по крайней мере, массив Array # будет сообщать 13 в этом случае. Вам нужно будет сделать #compact, чтобы получить количество активных процессоров. Однако, если вам нужны полные процессоры, возможно, лучше смотреть на /sys/devices/system/cpu [0-9] и подсчитать это. Это даст вам общее количество процессоров, но не сколько (или каких) активных.

Просто о чем подумать. Я пытаюсь пропустить патч к фактеру, чтобы добавить активныйпроцессорный счет и totalprocessorcount факт.

Ответ 12

Комбинация ответов @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

(возможно, вы захотите подключиться к grep, если у вас установлен cygwin)