¿Cómo obtener la cantidad de CPU/núcleos en Linux desde la línea de comando?

Resuelto Richard asked hace 13 años • 32 respuestas

Tengo este script, pero no sé cómo obtener el último elemento de la copia impresa:

cat /proc/cpuinfo | awk '/^processor/{print $3}'

El último elemento debe ser el número de CPU, menos 1.

Richard avatar Jun 26 '11 05:06 Richard
Aceptado

Procesar el contenido de /proc/cpuinfoes innecesariamente barroco. Utilice nproc, que forma parte de coreutils, por lo que debería estar disponible en la mayoría de las instalaciones de Linux.

El comando nprocimprime la cantidad de unidades de procesamiento disponibles para el proceso actual, que puede ser menor que la cantidad de procesadores en línea.

Para encontrar el número de todos los núcleos/procesadores instalados, utilicenproc --all

En mi máquina de 8 núcleos:

$ nproc --all
8
uckelman avatar Jun 13 '2013 13:06 uckelman
grep -c ^processor /proc/cpuinfo

contará el número de líneas que comienzan con "procesador" en/proc/cpuinfo

Para sistemas con hyper-threading, puede utilizar

grep ^cpu\\scores /proc/cpuinfo | uniq |  awk '{print $4}'

que debería devolver (por ejemplo) 8(mientras que el comando anterior devolvería 16)

unbeli avatar Jun 25 '2011 22:06 unbeli

La solución más portátil que he encontrado es el getconfcomando:

getconf _NPROCESSORS_ONLN

Esto funciona tanto en Linux como en Mac OS X. Otro beneficio de esto sobre otros enfoques es que getconf existe desde hace mucho tiempo. Algunas de las máquinas Linux más antiguas en las que tengo que desarrollar no tienen los comandos nproco lscpudisponibles, pero sí getconf.

Nota del editor: si bien la getconf utilidad tiene mandato POSIX , los valores_NPROCESSORS_ONLN específicos y no lo son. Dicho esto, como se indicó, funcionan tanto en plataformas Linux como en macOS; En FreeBSD/PC-BSD, debes omitir el ._NPROCESSORS_CONF _

mshildt avatar May 09 '2014 15:05 mshildt

Prefacio:

  • El problema con las /proc/cpuinforespuestas basadas en - es que analizan información destinada al consumo humano y, por lo tanto, carecen de un formato estable diseñado para el análisis automático : el formato de salida puede diferir según las plataformas y las condiciones de tiempo de ejecución; Usarlo lscpu -pen Linux (y sysctlen macOS) evita ese problema .

  • getconf _NPROCESSORS_ONLN/ getconf NPROCESSORS_ONLNno distingue entre CPU lógicas y físicas .


Aquí hay un shfragmento (compatible con POSIX) que funciona en Linux y macOS para determinar la cantidad de CPU físicas o lógicas en línea ; vea los comentarios para más detalles.

Se utiliza lscpupara Linux y sysctlmacOS.

Nota terminológica : CPU se refiere a la unidad de procesamiento más pequeña vista por el sistema operativo. Los núcleos sin Hyper-Threading corresponden cada uno a 1 CPU, mientras que los núcleos Hyper-Threading contienen más de 1 (normalmente: 2) CPU lógica.
Linux utiliza la siguiente taxonomía [1] , comenzando con la unidad más pequeña:
CPU < núcleo < socket < libro < nodo
y cada nivel comprende 1 o más instancias del siguiente nivel inferior.

#!/bin/sh

# macOS:           Use `sysctl -n hw.*cpu_max`, which returns the values of 
#                  interest directly.
#                  CAVEAT: Using the "_max" key suffixes means that the *maximum*
#                          available number of CPUs is reported, whereas the
#                          current power-management mode could make *fewer* CPUs 
#                          available; dropping the "_max" suffix would report the
#                          number of *currently* available ones; see [1] below.
#
# Linux:           Parse output from `lscpu -p`, where each output line represents
#                  a distinct (logical) CPU.
#                  Note: Newer versions of `lscpu` support more flexible output
#                        formats, but we stick with the parseable legacy format 
#                        generated by `-p` to support older distros, too.
#                        `-p` reports *online* CPUs only - i.e., on hot-pluggable 
#                        systems, currently disabled (offline) CPUs are NOT
#                        reported.

# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
  # Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, 
  # which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] && 
                       sysctl -n hw.logicalcpu_max || 
                       lscpu -p | egrep -v '^#' | wc -l)

# Number of PHYSICAL CPUs (cores).
  # Linux: The 2nd column contains the core ID, with each core ID having 1 or
  #        - in the case of hyperthreading - more logical CPUs.
  #        Counting the *unique* cores across lines tells us the
  #        number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] && 
                       sysctl -n hw.physicalcpu_max ||
                       lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)

# Print the values.
cat <<EOF
# of logical CPUs:  $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF

[1] Documentación de macOSsysctl (3)

Tenga en cuenta que los sistemas derivados de BSD distintos de macOS (por ejemplo, FreeBSD) solo admiten la hw.ncpuclave para sysctl, que están en desuso en macOS; No tengo claro cuál de las nuevas claves hw.npucorresponde a: hw.(logical|physical)cpu_[max].

Un saludo a @teambob por ayudar a corregir el lscpucomando de recuento de CPU física.

Advertencia : lscpu -pla salida NO incluye una columna de "libro" (la manpágina menciona "libros" como una entidad entre el socket y el nodo en la jerarquía taxonómica). Si hay "libros" en juego en un sistema Linux determinado ( ¿alguien sabe cuándo y cómo? ), el comando Physical-CPU-count puede subestimar el informe (esto se basa en la suposición de que lscpuinforma ID que no son únicos en los niveles superiores). -entidades de nivel ; por ejemplo: 2 núcleos diferentes de 2 sockets diferentes podrían tener el mismo ID).


Si guarda el código anterior como, por ejemplo, un script de shellcpus , lo hace ejecutable chmod +x cpusy lo coloca en una carpeta en su $PATH, verá un resultado como el siguiente:

$ cpus
logical  4
physical 4

[1] Xaekai arroja luz sobre lo que es un libro : "un libro es un módulo que alberga una placa de circuito con zócalos de CPU, zócalos de RAM, conexiones IO a lo largo del borde y un gancho para la integración del sistema de refrigeración. Se utilizan en mainframes IBM Más información: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "

mklement0 avatar Apr 30 '2014 02:04 mklement0