Per avere 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 esegui htop
(non corrispondono a 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 questo dovrebbe corrispondere alle 8 CPU riportate 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 (core id 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
riportato da /proc/cpuinfo
corrisponde al Core(s) per socket
riportato da lscpu
. Per la macchina desktop sopra questo 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, indica 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 utilità è dmidecode
che emette informazioni per 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
command ha una serie di opzioni utili che potresti voler controllare, ad esempio:
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Vedi man lscpu
per i dettagli.
In sintesi:
- Devi essere consapevole di socket, core e thread
- Devi stare attento al termine CPU in quanto significa cose diverse in contesti diversi
Devi guardare socket e core per socket. In questo caso hai 1 CPU fisica (socket) che ha 4 core (core per socket).
Puoi ottenere queste informazioni per nproc(1)
comando
$ nproc --all
12
Non richiede privilegi di root.