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?
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?
Respuestas:
nproc
es lo que buscas.
Más aquí: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
nproc
está en mi máquina virtual ubuntu, pero no en mi máquina basada en RedHat 5.5.
nproc --all
de todas las unidades de procesamiento instaladas. Sin --all
, nproc
solo muestra las Unidades de procesamiento disponibles para el proceso actual. Lea la página del manual para obtener más detalles. MMV.
La herramienta más simple viene con glibc y se llama getconf
:
$ getconf _NPROCESSORS_ONLN
4
nproc
esto, esto funciona (por defecto) en mac os x.
_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.
Creo que el método que das es el más portátil en Linux. En lugar de desove innecesaria cat
y wc
procesos, se puede acortar un poco:
$ grep --count ^processor /proc/cpuinfo
2
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.
online
archivo, más simple que lo que hace nproc)
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
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
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 grep
y egrep
no tienen -o
opción, por lo que sed
se usa en su lugar.