Per ottenere un quadro completo è necessario esaminare il numero di thread per core, core per socket e socket . Se moltiplichi questi numeri otterrai il numero di CPU sul tuo sistema.
CPU = Thread per core X core per socket X socket
Le CPU sono ciò che vedi quando corri htop
(non equivalgono alle CPU fisiche).
Ecco un esempio da una macchina desktop:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
E un server:
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 32
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
L'output di nproc
corrisponde al conteggio della CPU da lscpu
. Per la macchina desktop sopra questa dovrebbe corrispondere alle 8 CPU segnalate da lscpu
:
$ nproc --all
8
L'output di /proc/cpuinfo
dovrebbe corrispondere a queste informazioni, ad esempio sul sistema desktop sopra possiamo vedere che ci sono 8 processori (CPU) e 4 core (ID core 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
Il cpu cores
segnalato da /proc/cpuinfo
corrisponde al Core(s) per socket
segnalato da lscpu
. Per la macchina desktop sopra questa dovrebbe corrispondere ai 4 core per socket riportati da lscpu:
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Per rispondere in modo specifico alla tua domanda dici quanti core hai moltiplicando il numero di core che hai per socket per il numero di socket che hai.
Core = Core per socket X Socket
Per i sistemi di esempio sopra il desktop ha 4 core:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
Mentre il server ha 16:
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
Un'altra utile utility è dmidecode
quali output per informazioni sui socket. Nel caso del sistema server sopra elencato ci aspettiamo di vedere 8 core per socket e 16 thread per 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
Il lscpu
comando ha una serie di opzioni utili che che hanno la possibilità di controllare, ad esempio:
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Vedi man lscpu
per i dettagli.
In sintesi:
- È necessario essere consapevoli di socket, core e thread
- Devi stare attento al termine CPU in quanto significa cose diverse in contesti diversi