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 nproccorrespond 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/cpuinfodoit 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 coresrapporté par /proc/cpuinfocorrespond à celui Core(s) per socketrapporté 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 dmidecodesortie 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 lscpucommande 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 lscpupour 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