¿Cómo descubrir el número de núcleos * lógicos * en Mac OS X?

382

¿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 makegenerar. La respuesta de jkp, refinada por Chris Lloyd, fue exactamente lo que necesitaba. YMMV.

Mike DeSimone
fuente
Para Linux, evito tener que agregar uno usando:grep ^processor /proc/cpuinfo | wc -l
courtlandj
3
Consulte stackoverflow.com/questions/6481005/… Tenga en cuenta el nproccomando.
Mike DeSimone
perdón si esta es una pregunta novata, pero cuando te refieres a núcleos lógicos te refieres a núcleos físicos? ¿Cómo son los términos diferentes (o no)? Solo para entender lo que estás pidiendo mejor.
Charlie Parker
No, no me refiero a núcleos físicos. Un núcleo físico es un grupo de transistores en un chip que implementa un núcleo. Un núcleo lógico es algo que parece ser un núcleo para el sistema operativo y los programas de usuario. En la gran cantidad de casos, estos son lo mismo. Sin embargo, la tecnología Hyperthreading de Intel (y tal vez otras) hace que cada núcleo físico aparezca como dos núcleos lógicos.
Mike DeSimone

Respuestas:

798

Puede hacer esto usando la utilidad sysctl :

sysctl -n hw.ncpu
jkp
fuente
66
En un MacBook Air de 1.7GHz a mediados de 2011, este comando dice 4. Sin embargo, sospeché que realmente solo tiene 2 núcleos, y system_profiler SPHardwareDataType parece estar de acuerdo. ¿Puedes explicar la discrepancia?
Joshua Flanagan
13
@JoshuaFlanagan ¿cuántos núcleos físicos tiene la máquina y qué chip es? Si es un núcleo i7 con 2 núcleos físicos, por ejemplo, se mostrará como 4 porque el chip admite hiperprocesamiento y se presenta al sistema operativo como si tuviera 4 núcleos direccionables.
jkp
142
Si realmente te importa, prueba sysctl hw.physicalcpuo sysctl hw.logicalcpu, y en general, sysctl hwtodas las opciones.
Codificador de longitud variable el
23
Editores: Por favor, no cambie la respuesta años después de haberla aceptado.
Mike DeSimone
2
No funciona en Mac de principios de 2015 con El Capitan. Me sale "error:" hw.ncpu "es una clave desconocida". No hay entrada relacionada con la CPU en /etc/sysctl.conf tampoco. La respuesta de Frozen Flame funcionó.
TheGT
130

Aún más fácil:

sysctl -n hw.ncpu
mlbright
fuente
2
El número informado por esto es en realidad el doble del número de núcleos si su procesador admite hiperprocesamiento.
mikeazo
3
esto me da 4, pero cuando uso lo system_profiler SPHardwareDataTypeque 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`
Ciasto piekarz
31

Esto debería ser multiplataforma. Al menos para Linux y Mac OS X.

python -c 'import multiprocessing as mp; print(mp.cpu_count())'

Un poco lento pero funciona.

Llama congelada
fuente
18

Para hacer esto en C, puede usar la familia de funciones sysctl (3):

int count;
size_t count_len = sizeof(count);
sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0);
fprintf(stderr,"you have %i cpu cores", count);

Los valores interesantes para usar en lugar de "hw.logicalcpu", que cuenta los núcleos, son:

hw.physicalcpu - The number of physical processors available in the current power management mode.

hw.physicalcpu_max - The maximum number of physical processors that could be available this boot.

hw.logicalcpu - The number of logical processors available in the current power management mode.

hw.logicalcpu_max - The maximum number of logical processors that could be available this boot.
alfwatt
fuente
Mike, gracias por la edición, no se dio cuenta de que oldplen era un parámetro de entrada.
alfwatt
14

system_profiler SPHardwareDataType muestra que tengo 1 procesador y 4 núcleos.

[~] system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro9,1
      Processor Name: Intel Core i7
      Processor Speed: 2.6 GHz
      Number of Processors: 1
      Total Number of Cores: 4

      <snip>

[~] 

Sin embargo, sysctl no está de acuerdo:

[~] sysctl -n hw.logicalcpu
8
[~] sysctl -n hw.physicalcpu
4
[~] 

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):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
usuario1706991
fuente
3
Estás viendo Hyperthreading en el trabajo. Esto permite que cada núcleo maneje dos subprocesos de ejecución (no necesariamente los mismos que los subprocesos del sistema operativo, como pthreads). Como resultado, MacOS trata cada núcleo físico como dos núcleos lógicos.
Mike DeSimone
Hola @MikeDeSimone, ¿puedes mostrarme cómo verificar si Hyper Threading funciona en el caso de CentOS?
Ciasto piekarz
@Ciastopiekarz Estoy bastante seguro de que Hyper Threading es una característica de la arquitectura de la CPU (Intel) en lugar de algo que hace el sistema operativo, creo que el objetivo es hacer que el sistema operativo piense que tiene CPU física: núcleos lógicos sx 2 sin tener que hacer nada especial para acceder a ellos. Entonces, si su CPU es Intel (todas las Mac vienen con Intel), entonces sí, tiene hiperprocesamiento. Sin embargo, si ejecuta CentOS en una PC, es posible que tenga un procesador AMD. No tienen hiperprocesamiento, pero dado que generalmente vienen con el doble de núcleos al mismo precio (o menor), no estoy seguro de que haya una diferencia práctica.
Erk
@Erk El sistema operativo conoce la diferencia, de hecho, conoce la diferencia entre CPU y núcleos, así como múltiples subprocesos que se ejecutan en un físico. sysctl hw.physicalcpumostrará cuántos núcleos de CPU físicos están disponibles para usted, sysctl hw.logicalcpumostrará 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.
Rahly
10
$ system_profiler | grep 'Total Number Of Cores'
kent
fuente
2
más rápido: $ system_profiler SPHardwareDataType | grep 'Número total de núcleos'
kent
66
más lento, aunque si se incluye el tiempo de escribir
Alto Rendimiento Marcos
2
Está en un script bash; El tiempo de escritura es irrelevante.
Mike DeSimone el
3
parece que Apple ha cambiado el formato de la salida. Observe la capitalización: anteriormente era 'Número total de núcleos' ahora es 'Número total de núcleos' ... o eso o simplemente lo escribí mal anteriormente ... ¡perdón por eso!
Kent
3
podrías usargrep -i
Skylar Saveland 01 de
8

Usa el system_profiler | grep "Cores"comando.

Tengo un:

MacBook Pro Retina, mediados de 2012.

Procesador: 2.6 GHz Intel Core i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

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 sysctly usar el system_profilervalor 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.

NetworkN8
fuente
1
Generar una cantidad de procesos igual a la cantidad de núcleos lógicos (el doble de la cantidad de núcleos físicos en el caso de HyperThreading, como notará) me ha funcionado bastante bien.
Mike DeSimone
7

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:

system_profiler SPHardwareDataType
Esconder
fuente
El objetivo era determinar con cuántos procesos generar make, por lo que la respuesta de jkp (número de núcleos lógicos) se ajusta mejor.
Mike DeSimone
3

El siguiente comando le brinda toda la información sobre su CPU

$ sysctl -a | sort | grep cpu
asmaier
fuente
Agradable, pero no lo que se le pidió.
Mike DeSimone
1

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

  1. da información incorrecta
  2. no proporciona información debido a un error en la implementación del comando
  3. corre increíblemente lento (toma la mayor parte de un minuto en completarse), o
  4. proporciona demasiados datos y, por lo tanto, podría ser útil para uso interactivo, pero es inútil si desea usar los datos mediante programación (por ejemplo, como entrada a un comando como bundle install --jobs 3donde desea que el número en lugar de 3sea ​​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:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
iconoclasta
fuente
3
Acabo de ejecutar sysctl -n hw.ncpumi Mac Pro y no tuve ninguno de esos problemas.
Mike DeSimone
Obviamente no he probado en todos los tipos de Mac, pero creo que a veces es correcto. Sin embargo, sysctlno 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.
iconoclasta
También podría explicar el comportamiento erróneo que ve y en qué plataforma (s) lo ve, para que los límites de sysctlla operación adecuada sean mejor conocidos, como lo hizo el usuario 1706991.
Mike DeSimone
Otros han sugerido que esto se debe a hiperprocesamiento, por lo que el número que ve con sysctl es el número de núcleos que el sistema está tratando de simular, aunque en realidad no tiene tantos. Si quieres números precisos, usa mi método. Si desea saber cuántos núcleos pretende tener la computadora, use sysctl.
iconoclasta
@iconoclast al probar esto, encontré que 'Número total de núcleos' está localizado. Si OS X está configurado en otra cosa que no sea inglés, su solución falla. Terminó usando:sysctl -n hw.physicalcpu_max
CO
1

En un MacBook Pro con Mavericks , sysctl -a | grep hw.cpusolo devolverá algunos detalles crípticos. Se revela información mucho más detallada y accesible en la machdep.cpusección, es decir:

sysctl -a | grep machdep.cpu

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).

sysctl -a | grep machdep.cpu  | grep per_package
Karl Ehr
fuente
En mi Mac Pro de principios de 2008, eso me da 4. El número real de núcleos es 8, ya que tiene dos chips de CPU de cuatro núcleos.
Mike DeSimone
sysctl machdep.cpu también funciona en lugar de leer toda otra información innecesaria.
hsn
1

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), nproces uno de los binarios comunes de GNU que se incluye en el coreutilspaquete.

brew install coreutils

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 no nprocvs sysctl -n hw.logicalcpu, esta puede ser una mejor opción.

Ryan Parman
fuente
0

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

marca
fuente
0

Esto se puede hacer de una manera más portátil:

$ nproc --all
32

Compatible con macOS y Linux.

Jay Taylor
fuente
2
nprocno parece estar disponible en macOS Mojave.
Mike DeSimone
Gracias por hacérmelo saber, Mike. nproces una instalación trivial a través de homebrew.
Jay Taylor
El sistema que estaba ejecutando estaba desconectado de Internet, por lo que homebrew no ayuda. No se puede usar nada que necesite "curl site | sudo bash"
Mike DeSimone