Pour obtenir une image complète, vous devez examiner le nombre de threads par cœur, de cœurs par socket et de sockets. Si vous multipliez ces nombres, vous obtiendrez le nombre de processeurs sur votre système.
CPU =Threads par cœur X cœurs par socket X sockets
Les processeurs sont ce que vous voyez lorsque vous exécutez htop
(cela n'équivaut pas à des processeurs physiques).
Voici un exemple sur une machine de bureau :
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 8
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 1
Et un serveur :
$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s): 32
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 2
La sortie de nproc
correspond au nombre de CPU à partir de lscpu
. Pour la machine de bureau ci-dessus, cela doit correspondre aux 8 processeurs signalés par lscpu
:
$ nproc --all
8
La sortie de /proc/cpuinfo
doit correspondre à ces informations, par exemple sur le système de bureau ci-dessus, nous pouvons voir qu'il y a 8 processeurs (CPU) et 4 cœurs (ID de cœur 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
Le cpu cores
rapporté par /proc/cpuinfo
correspond au Core(s) per socket
rapporté par lscpu
. Pour la machine de bureau ci-dessus, cela doit correspondre aux 4 cœurs par socket signalés par lscpu :
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Pour répondre précisément à votre question, indiquez le nombre de cœurs dont vous disposez en multipliant le nombre de cœurs que vous avez par socket par le nombre de sockets dont vous disposez.
Cœurs =Cœurs par socket X Sockets
Pour les exemples de systèmes ci-dessus, le bureau a 4 cœurs :
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4
Alors que le serveur en a 16 :
$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16
Un autre utilitaire utile est dmidecode
qui génère des informations par socket. Dans le cas du système de serveur répertorié ci-dessus, nous nous attendons à voir 8 cœurs par socket et 16 threads par 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
Le lscpu
La commande a un certain nombre d'options utiles que vous voudrez peut-être consulter, par exemple :
$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'
Voir man lscpu
pour plus de détails.
En résumé :
- Vous devez connaître les sockets, les cœurs et les threads
- Vous devez faire attention au terme CPU car il signifie différentes choses dans différents contextes
Vous devez regarder les sockets et les cœurs par socket. Dans ce cas, vous avez 1 CPU physique (socket) qui a 4 cœurs (cœurs par socket).
Vous pouvez obtenir ces informations par nproc(1)
commande
$ nproc --all
12
Il ne nécessite pas de privilèges root.