ruby - sirve - Detecta el número de CPU instaladas
ruby tutorial (12)
Ya encontré una solución para "Most unixes" a través de cat /proc/cpuinfo
, pero una solución pura de Ruby sería más agradable.
@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
A partir de la versión 2.2.3 de Ruby, el módulo de etc
en Ruby''s stdlib ofrece un método nprocessors
que devuelve la cantidad de procesadores. La advertencia de esto es que si ruby se relega a un subconjunto de núcleos de CPU, Etc.nprocessors
solo devolverá la cantidad de núcleos a los que Ruby tiene acceso. Además, como señaló seanlinsley , esto solo devolverá núcleos virtuales en lugar de núcleos físicos, lo que puede seanlinsley una disparidad en el valor esperado.
require ''etc''
p Etc.nprocessors #=> 4
Actualmente estoy usando esto, que cubre todos los sistemas operativos. 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
Aquí hay una implementación para Linux, OSX, Windows y BSD: https://gist.github.com/1009994
Código fuente:
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
Combinación de la respuesta de @ grosser y @ paxdiablo, ya que en mi sistema (winxp) win32_computersystem no tiene información del procesador; esto funciona sin embargo:
require ''win32ole''
wmi = WIN32OLE.connect("winmgmts://")
info = wmi.ExecQuery ("select NumberOfCores from Win32_processor")
puts info.to_enum.first.NumberOfCores
Para ver qué hay disponible en su sistema, ejecute esto desde powershell (usé 1.0 en este caso):
Get-WmiObject -list
(podría querer pipe to grep si tienes instalado cygwin)
EDITAR: Now rails se envía con concurrent-ruby como una dependencia, por lo que es probablemente la mejor solución;
$ 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
ver http://ruby-concurrency.github.io/concurrent-ruby/root/Concurrent.html para más información.
y aquí está la respuesta anterior;
$ 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>
Esta gema facter es la mejor si quieres otros datos sobre el sistema también, no es específico de la plataforma y está diseñado para hacer esto exactamente.
ACTUALIZACIÓN: actualizado para incluir la sugerencia de Nathan Kleyn sobre el cambio de API.
En Linux también puede usar nproc
, que es más limpio que las otras soluciones basadas en subshell aquí. Quería que vagabundo le diera la misma cantidad de CPU a la máquina virtual que el host. Vagrantfile
esto a Vagrantfile
:
vb.cpus = `nproc`.to_i
Encontré algo recientemente que debe tenerse en cuenta. Puede desactivar procesadores (ponerlos fuera de línea), y luego facter processorcount (más algunos de los otros métodos anteriores) da el resultado incorrecto. Puede contar líneas de procesador en / proc / cpuinfo, siempre que lo haga correctamente. Si acaba de poblar una matriz con números de índice de los procesos, si tiene espacios vacíos en los procesos (como en, los procesos 0,1,2,10,11,12 están activos, todos los demás a 20 dicen que están inactivos), lo hará automáticamente aparecen los índices 3-9 (más o menos), al menos el tamaño de Array # reportará 13 en ese caso. Tendría que hacer #compact para obtener la cantidad de procesadores activos. Sin embargo, si quiere procesadores totales, quizás sea mejor mirar / sys / devices / system / cpu [0-9], y contar eso. Eso le dará la cantidad total de procesadores, pero no cuántos (o cuáles) están activos.
Solo algo para pensar. Estoy tratando de pasar un parche a un facter para agregar un contador activo de proceso y hecho de cuenta total de proceso.
Intenté usar Facter
pero me pareció un poco lento. Probé la gema del system
y la encontré mucho más rápido. También es muy fácil de usar: System::CPU.count
.
Sin duda, si puede cat
, puede abrirlo, leerlo y cerrarlo usando las características estándar del idioma sin recurrir a una llamada de tipo system()
.
Puede que necesite detectar en qué plataforma está dinámicamente y:
- utilice el "archivo"
/proc/cpuinfo
para Linux; o - comunicarse con WMI para Windows.
Esa última línea puede usar:
require ''win32ole''
wmi = WIN32OLE.connect("winmgmts://")
info = wmi.ExecQuery ("select * from Win32_ComputerSystem")
Luego usa el ítem NumberOfProcessors la información.
con JRuby puedes verificarlo con el siguiente código Java:
Runtime runtime = Runtime.getRuntime();
int numberOfProcessors = runtime.availableProcessors();
en Mac:
thiago-pradis-macbook: ~ tchandy $ hwprefs cpu_count
2