¿Cómo puede saber, desde la línea de comandos, cuántos núcleos hay en la máquina cuando ejecuta Mac OS X? En Linux, uso:
x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)
No es perfecto, pero está cerca. Esto está destinado a alimentarse make
, por lo que da un resultado 1 mayor que el número real. Y sé que el código anterior se puede escribir más denso en Perl o se puede escribir usando grep, wc y cut, pero decidí que lo anterior era una buena compensación entre la concisión y la legibilidad.
EDICIÓN MUY TARDÍA: Solo para aclarar: estoy preguntando cuántos núcleos lógicos hay disponibles, porque esto corresponde con cuántos trabajos simultáneos quiero make
generar. La respuesta de jkp, refinada por Chris Lloyd, fue exactamente lo que necesitaba. YMMV.
grep ^processor /proc/cpuinfo | wc -l
nproc
comando.Respuestas:
Puede hacer esto usando la utilidad sysctl :
fuente
sysctl hw.physicalcpu
osysctl hw.logicalcpu
, y en general,sysctl hw
todas las opciones.Aún más fácil:
fuente
system_profiler SPHardwareDataType
que puedo creer `Identificador del modelo: MacBookPro9,2 Nombre del procesador: Intel Core i5 Velocidad del procesador: 2.5 GHz Número de procesadores: 1 Número total de núcleos: 2`Esto debería ser multiplataforma. Al menos para Linux y Mac OS X.
Un poco lento pero funciona.
fuente
Para hacer esto en C, puede usar la familia de funciones sysctl (3):
Los valores interesantes para usar en lugar de "hw.logicalcpu", que cuenta los núcleos, son:
fuente
system_profiler SPHardwareDataType
muestra que tengo 1 procesador y 4 núcleos.Sin embargo, sysctl no está de acuerdo:
Pero sysctl parece correcto, ya que cuando ejecuto un programa que debería ocupar todas las ranuras de CPU, veo que este programa toma cerca del 800% del tiempo de CPU (en
top
):fuente
sysctl hw.physicalcpu
mostrará cuántos núcleos de CPU físicos están disponibles para usted,sysctl hw.logicalcpu
mostrará cuántos CPU lógicos están disponibles para usted. Los sistemas operativos como Windows / OSX / Linux hacen todo el trabajo para que parezca que tienes múltiples CPU (independientemente de qué tipo sea). Los sistemas operativos como Linux le permiten configurar qué CPU, núcleos y subprocesos se pueden utilizar.fuente
grep -i
Usa el
system_profiler | grep "Cores"
comando.Tengo un:
Según Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) no hay Core i7 con 8 núcleos físicos, por lo que la idea de Hyperthreading debe ser el caso. Ignorar
sysctl
y usar elsystem_profiler
valor para la precisión. La verdadera pregunta es si puede ejecutar eficientemente aplicaciones con 4 núcleos (¿trabajos de compilación largos?) Sin interrumpir otros procesos.Ejecutar un compilador en paralelo con 4 núcleos no parece afectar dramáticamente las operaciones normales del sistema operativo. Entonces, quizás tratarlo como 8 núcleos no sea tan malo.
fuente
Como dijo jkp en un comentario, eso no muestra el número real de núcleos físicos. para obtener la cantidad de núcleos físicos, puede usar el siguiente comando:
fuente
make
, por lo que la respuesta de jkp (número de núcleos lógicos) se ajusta mejor.El siguiente comando le brinda toda la información sobre su CPU
fuente
ACLARACIÓN
Cuando se hizo esta pregunta, el OP no dijo que quería la cantidad de núcleos LÓGICOS en lugar de la cantidad real de núcleos, por lo que esta respuesta lógicamente (sin juego de palabras) responde con una forma de obtener el verdadero número de núcleos físicos reales, no El número que el sistema operativo intenta virtualizar a través del vudú hyperthreading.
ACTUALIZACIÓN PARA MANEJAR LA FALLA EN YOSEMITE
Debido a un error extraño en OS X Yosemite (y posiblemente versiones más nuevas, como el próximo El Capitan), he hecho una pequeña modificación. (La versión anterior todavía funcionaba perfectamente si ignoraba STDERR, que es todo lo que la modificación hace por usted).
Cualquier otra respuesta dada aquí tampoco
bundle install --jobs 3
donde desea que el número en lugar de3
sea uno menor que el número de núcleos que tienes, o al menos no más que el número de núcleos)La forma de obtener solo la cantidad de núcleos, de manera confiable, correcta, razonablemente rápida y sin información adicional o incluso caracteres adicionales alrededor de la respuesta, es esta:
fuente
sysctl -n hw.ncpu
mi Mac Pro y no tuve ninguno de esos problemas.sysctl
no da resultados precisos en mi máquina, y otros han informado lo mismo. Si no se puede confiar en que siempre dé resultados precisos, entonces no se puede considerar confiable y preciso.sysctl
la operación adecuada sean mejor conocidos, como lo hizo el usuario 1706991.sysctl -n hw.physicalcpu_max
En un MacBook Pro con Mavericks ,
sysctl -a | grep hw.cpu
solo devolverá algunos detalles crípticos. Se revela información mucho más detallada y accesible en lamachdep.cpu
sección, es decir:En particular, para los procesadores con
HyperThreading
(HT), verá el recuento total de CPU enumerado (logical_per_package
) como el doble del recuento de núcleos físicos (cores_per_package
).fuente
No se especificó en la pregunta original (aunque vi la publicación de OP en los comentarios que esta no era una opción), pero muchos desarrolladores en macOS tienen instalado el administrador de paquetes Homebrew.
Para los futuros desarrolladores que se topan con esta pregunta, siempre y cuando exista la suposición (o requisito) de que se instale Homebrew (por ejemplo, en una organización de ingeniería en una empresa),
nproc
es uno de los binarios comunes de GNU que se incluye en elcoreutils
paquete.Si tiene scripts que preferiría escribir una vez (para Linux + macOS) en lugar de dos veces, o para evitar tener
if
bloques donde necesita detectar el sistema operativo para saber si llamar o nonproc
vssysctl -n hw.logicalcpu
, esta puede ser una mejor opción.fuente
Comentarios para 2 buenas respuestas anteriores:
1) re la respuesta aceptada (y comentarios) por jkp: hw.ncpu aparentemente está en desuso a favor de hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )
2) re la actualización de 2014 de Karl Ehr: en mi computadora (con 2.5 ghz intel core i7),
sysctl -a | grep machdep.cpu | grep per_package
devuelve diferentes números:machdep.cpu.logical_per_package: 16
machdep.cpu.cores_per_package: 8
Los valores deseados son:
machdep.cpu.core_count: 4
machdep.cpu.thread_count: 8
Cual partido:
hw.physicalcpu: 4
hw.logicalcpu: 8
fuente
Esto se puede hacer de una manera más portátil:
Compatible con macOS y Linux.
fuente
nproc
no parece estar disponible en macOS Mojave.nproc
es una instalación trivial a través de homebrew.