Número de procesadores / núcleos en la línea de comandos

108

Estoy ejecutando el siguiente comando para obtener la cantidad de procesadores / núcleos en Linux:

cat /proc/cpuinfo | grep processor | wc -l

Funciona pero no parece elegante. ¿Cómo sugeriría mejorarlo?

Miguel
fuente
posible duplicado de Obtener el número de CPU / núcleos en Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

138

nproc es lo que buscas.

Más aquí: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

pax162
fuente
11
Agradable, pero no tan ubicuo como / proc / cpuinfo. nprocestá en mi máquina virtual ubuntu, pero no en mi máquina basada en RedHat 5.5.
Digital Trauma
8
Asegúrese nproc --allde todas las unidades de procesamiento instaladas. Sin --all, nprocsolo muestra las Unidades de procesamiento disponibles para el proceso actual. Lea la página del manual para obtener más detalles. MMV.
JamesThomasMoon1979
96

La herramienta más simple viene con glibc y se llama getconf:

$ getconf _NPROCESSORS_ONLN
4
Harald Hoyer
fuente
8
Aún mejor, es una utilidad POSIX: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
a diferencia de nprocesto, esto funciona (por defecto) en mac os x.
Alec Jacobson
Desafortunadamente, aunque esta utilidad está disponible en Solaris, _NPROCESSORS_ONLN(o cualquier cosa con cpu, proc, etc.) aparece en su salida. Tenía la esperanza de que, dado que es una herramienta posix, funcionaría en Linux / Solaris para no tener que usar la ramificación.
Brian Vandenberg
39

Creo que el método que das es el más portátil en Linux. En lugar de desove innecesaria caty wcprocesos, se puede acortar un poco:

$ grep --count ^processor /proc/cpuinfo
2
Trauma digital
fuente
25

Si desea hacer esto para que funcione en Linux y OS X, puede hacer:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
fuente
Buen
2
En Solaris, debe usar psrinfo -pen su lugar
mems
14

En los núcleos más nuevos, también podría usar la /sys/devices/system/cpu/interfaz para obtener un poco más de información:

$ ls /sys/devices/system/cpu/
cpu0  cpufreq  kernel_max  offline  possible  present  release
cpu1  cpuidle  modalias    online   power     probe    uevent
$ cat /sys/devices/system/cpu/kernel_max 
255
$ cat /sys/devices/system/cpu/offline 
2-63
$ cat /sys/devices/system/cpu/possible 
0-63
$ cat /sys/devices/system/cpu/present 
0-1
$ cat /sys/devices/system/cpu/online 
0-1

Consulte los documentos oficiales para obtener más información sobre lo que significan todos estos.

Trauma digital
fuente
2
nproc usa esto, principalmente ($ OMP_NUM_THREADS luego readdir sysfs). Creo que esta es la mejor interfaz.
Tobu
2
Y getconf también se basa en esta interfaz (el onlinearchivo, más simple que lo que hace nproc)
Tobu
6

Cuando alguien pregunta "el número de procesadores / núcleos", se solicitan 2 respuestas. El número de "procesadores" sería el número físico instalado en los zócalos de la máquina.

El número de "núcleos" sería núcleos físicos. Los núcleos (virtuales) con hiperproceso no se incluirían (al menos en mi opinión). Como alguien que escribe muchos programas con grupos de subprocesos, realmente necesita saber el recuento de núcleos físicos frente a núcleos / hyperthreads. Dicho esto, puede modificar el siguiente script para obtener las respuestas que necesita.

#!/bin/bash

MODEL=`cat /cpu/procinfo | grep "model name" | sort | uniq`
ALL=`cat /proc/cpuinfo | grep "bogo" | wc -l`
PHYSICAL=`cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
CORES=`cat /proc/cpuinfo | grep "cpu cores" | sort | uniq | cut -d':' -f2`
PHY_CORES=$(($PHYSICAL * $CORES))
echo "Type $MODEL"
echo "Processors $PHYSICAL"
echo "Physical cores $PHY_CORES"
echo "Including hyperthreading cores $ALL"

El resultado en una máquina con 2 procesadores físicos modelo Xeon X5650, cada uno con 6 núcleos físicos que también admiten hyperthreading:

Type model name : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
Processors 2
Physical cores 12
Including hyperthreading cores 24

En una máquina con 2 procesadores mdeol Xeon E5472 cada uno con 4 núcleos físicos que no admiten hyperthreading

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
Rabinh
fuente
Esta es la respuesta más completa que me dio la información que estaba buscando.
WoodenToaster
4

El lscpu(1)comando proporcionado por el proyecto util-linux también puede ser útil:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Model name:            Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
Stepping:              9
CPU MHz:               3406.253
CPU max MHz:           3600.0000
CPU min MHz:           1200.0000
BogoMIPS:              5787.10
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              4096K
NUMA node0 CPU(s):     0-3
mtk
fuente
1

Esto es para aquellos que desean una forma portátil de contar núcleos de CPU en * bsd, * nix o solaris (no lo he probado en aix y hp-ux, pero debería funcionar). Siempre me ha funcionado.

dmesg | \
egrep 'cpu[. ]?[0-9]+' | \
sed 's/^.*\(cpu[. ]*[0-9]*\).*$/\1/g' | \
sort -u | \
wc -l | \
tr -d ' '

solaris grepy egrepno tienen -oopción, por lo que sedse usa en su lugar.

gwillie
fuente
1

Otro one-liner, sin contar los núcleos hiperprocesados :

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 
Marco
fuente
0

Si necesita un método independiente del sistema operativo, funciona en Windows y Linux. Usa Python

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
Meitham
fuente