Para obtener una imagen completa, debe observar la cantidad de subprocesos por núcleo, núcleos por zócalo y zócalos. Si multiplica estos números, obtendrá la cantidad de CPU en su sistema.
CPU =Subprocesos por núcleo X núcleos por socket X sockets
Las CPU son lo que ves cuando ejecutas htop
(estos no equivalen a CPU físicas).
Aquí hay un ejemplo de una máquina de escritorio:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Y un servidor:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 32
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
La salida de nproc
corresponde al conteo de CPU de lscpu
. Para la máquina de escritorio anterior, esto debería coincidir con las 8 CPU informadas por lscpu
:
$ nproc --all
8
La salida de /proc/cpuinfo
debe coincidir con esta información, por ejemplo, en el sistema de escritorio anterior podemos ver que hay 8 procesadores (CPU) y 4 núcleos (ID de núcleo 0-3):
$ grep -E 'processor|core id' /proc/cpuinfo
processor : 0
core id : 0
processor : 1
core id : 0
processor : 2
core id : 1
processor : 3
core id : 1
processor : 4
core id : 2
processor : 5
core id : 2
processor : 6
core id : 3
processor : 7
core id : 3
Los cpu cores
denunciado por /proc/cpuinfo
corresponde al Core(s) per socket
denunciado por lscpu
. Para la máquina de escritorio anterior, esto debería coincidir con los 4 núcleos por socket informados por lscpu:
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Para responder específicamente a su pregunta, diga cuántos núcleos tiene multiplicando la cantidad de núcleos que tiene por socket por la cantidad de sockets que tiene.
Núcleos =Núcleos por socket X Sockets
Para los sistemas de ejemplo anteriores, el escritorio tiene 4 núcleos:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
Mientras que el servidor tiene 16:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
Otra utilidad útil es dmidecode
qué salidas por información de socket. En el caso del sistema de servidor mencionado anteriormente, esperamos ver 8 núcleos por socket y 16 subprocesos por socket:
$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
Socket Designation: CPU1
Core Count: 8
Thread Count: 16
Socket Designation: CPU2
Core Count: 8
Thread Count: 16
El lscpu
El comando tiene una serie de opciones útiles que le gustaría consultar, por ejemplo:
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Ver man lscpu
para más detalles.
En resumen:
- Debe tener en cuenta los sockets, los núcleos y los subprocesos
- Debe tener cuidado con el término CPU, ya que significa diferentes cosas en diferentes contextos
Tienes que mirar sockets y núcleos por socket. En este caso, tiene 1 CPU física (zócalo) que tiene 4 núcleos (núcleos por zócalo).
Puede obtener esta información por nproc(1)
comando
$ nproc --all
12
No requiere privilegios de root.