Pour obtenir une image complète, vous devez connaître le nombre de threads par noyau, de cœurs par socket et de sockets . Si vous multipliez ces nombres, vous obtiendrez le nombre de processeurs de votre système.
CPU = nombre de threads par cœur X par cœur par socket X sockets
Les processeurs correspondent à ce que vous voyez lorsque vous exécutez htop
(ils ne correspondent pas à des processeurs physiques).
Voici un exemple tiré d'un ordinateur 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 processeurs à partir de lscpu
. Pour la machine de bureau ci-dessus, cela devrait correspondre aux 8 CPU (s) 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 (identificateurs principaux 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 à celui Core(s) per socket
rapporté par lscpu
. Pour la machine de bureau ci-dessus, cela doit correspondre aux 4 cœurs par socket rapportés par lscpu:
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Pour répondre spécifiquement à votre question, vous indiquez le nombre de cœurs que vous avez en multipliant le nombre de cœurs que vous avez par socket par le nombre de sockets que vous avez.
Noyaux = Noyaux 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 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 la dmidecode
sortie 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
La lscpu
commande contient un certain nombre d’options utiles que vous voudrez peut-être extraire, 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 être conscient des sockets, des cœurs et des threads
- Vous devez faire attention au terme CPU car il signifie différentes choses dans différents contextes