¿Cómo obtener la cantidad de CPU/núcleos en Linux desde la línea de comando?
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.
Procesar el contenido de /proc/cpuinfo
es 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 nproc
imprime 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
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
)
La solución más portátil que he encontrado es el getconf
comando:
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 nproc
o lscpu
disponibles, 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
_
Prefacio:
El problema con las
/proc/cpuinfo
respuestas 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; Usarlolscpu -p
en Linux (ysysctl
en macOS) evita ese problema .getconf _NPROCESSORS_ONLN
/getconf NPROCESSORS_ONLN
no distingue entre CPU lógicas y físicas .
Aquí hay un sh
fragmento (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 lscpu
para Linux y sysctl
macOS.
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.ncpu
clave para sysctl
, que están en desuso en macOS; No tengo claro cuál de las nuevas claves hw.npu
corresponde a: hw.(logical|physical)cpu_[max]
.
Un saludo a @teambob por ayudar a corregir el lscpu
comando de recuento de CPU física.
Advertencia : lscpu -p
la salida NO incluye una columna de "libro" (la man
pá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 lscpu
informa 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 cpus
y 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 "