tutorial sirve rails que para documentacion descargar ruby

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.



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