Je voulais savoir combien de cœurs mon système possède, j'ai donc cherché la même question dans Google. J'ai reçu quelques commandes telles que la commande lscpu
. Lorsque j'ai essayé cette commande, elle m'a donné le résultat suivant:
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 23
Stepping: 10
CPU MHz: 1998.000
BogoMIPS: 5302.48
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 2048K
NUMA node0 CPU(s): 0-3
En particulier, cette sortie montre:
Lequel de ceux-ci indique les cœurs d'un système Linux?
Existe-t-il une autre commande pour indiquer le nombre de cœurs, ou suis-je en supposant que c'est complètement faux?
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).
Pour obtenir une image complète, vous devez regarder le nombre de threads par core, cores par socket et sockets . Si vous multipliez ces nombres, vous obtiendrez le nombre de CP sur votre système.
CPU = Threads par cœur X cœurs par socket X sockets
Les CPU sont ce que vous voyez lorsque vous exécutez htop
(ceux-ci ne correspondent pas aux CPU physiques).
Voici un exemple d'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 de lscpu
. Pour la machine de bureau ci-dessus, cela devrait correspondre aux 8 CPU signalés par lscpu
:
$ nproc --all
8
La sortie de /proc/cpuinfo
Devrait 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 (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
Le cpu cores
Rapporté par /proc/cpuinfo
Correspond à la Core(s) per socket
rapportée par lscpu
. Pour la machine de bureau ci-dessus, cela devrait correspondre aux 4 cœurs par socket signalés par lscpu:
$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores : 4
Pour répondre spécifiquement à votre question, vous dites combien de cœurs 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 systèmes d'exemple 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 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 commande lscpu
propose un certain nombre d'options utiles que vous aimeriez découvrir, 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 pouvez obtenir ces informations par la commande nproc(1)
$ nproc --all
12
Il ne nécessite pas de privilèges root.
Pour que la réponse ne prête pas à confusion, vous devez comprendre quelques concepts d'architecture informatique simples:
Il existe différents types d'instructions. La logique de décision à l'intérieur d'un CPU enverra les différentes instructions à différents nités matérielles. Par exemple, les instructions arithmétiques sont en fait exécutées par un ALU (unité arithmétique/logique), tandis que les instructions qui chargent/stockent à partir de la mémoire sont exécutées par une sorte de - nité de mémoire.
Un core fait référence à un ensemble de matériel d'exécution réel (c'est-à-dire que chaque core a une ALU, une unité de mémoire, etc ...)
Vous pouvez avoir plusieurs processeurs qui partagent un cœur - c'est ce qu'on appelle l'hyperthreading.
Un socket est l'emplacement physique de la carte mère dans lequel une puce est insérée. Cette puce contient un certain nombre de cœurs.
L'exemple du PO:
CPU(s): 4
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
Un autre exemple:
CPU(s): 16
Thread(s) per core: 2
Core(s) per socket: 4
Socket(s): 2
Deux sockets physiques, chacun contenant une puce avec 4 cœurs physiques, soit 8 cœurs au total. Deux threads peuvent émettre des instructions pour chaque cœur (cette machine a un hyperthreading), ce qui signifie qu'il doit y avoir deux processeurs attachés à chaque cœur, soit un total de 8 * 2 = 16 processeurs
La première machine peut exécuter précisément quatre instructions à tout moment et pendant une période donnée. La deuxième machine peut exécuter entre 8 et 16 instructions à tout moment: 16 ne seront atteintes que lorsque chaque paire de CPU exécute différents types d'instructions et peut ainsi partager un cœur sans attendre.
Vous pouvez également utiliser la commande cat /proc/cpuinfo
qui produira un bloc de données pour chaque cœur. Chaque morceau commence par cette information:
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 60
model name : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)
Les cœurs sont numérotés à partir de 0, donc si le dernier bloc indique processor : 3
comme dans ce cas, votre machine possède 4 cœurs.
getconf _NPROCESSORS_ONLN
(getconf fait partie de la glibc)
$ grep -c processor /proc/cpuinfo
8
C'est tout ce dont vous avez besoin. Il s'agit du nombre de cœurs en ligne, que l'hyperthreading soit activé ou désactivé.
$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8
Un autre moyen simple.
[root@xxxxx ~]# dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
Socket Designation: CPU1
Manufacturer: Intel
HTT (Multi-threading)
Version: Intel(R) Xeon(R) CPU L5640 @ 2.27GHz
Core Count: 6
Core Enabled: 6
Thread Count: 12
Socket Designation: CPU2
Manufacturer: Intel
HTT (Multi-threading)
Version: Intel(R) Xeon(R) CPU L5640 @ 2.27GHz
Core Count: 6
Core Enabled: 6
Thread Count: 12
J'ai trouvé ça:
echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
Je veux juste ajouter quelques informations à la réponse de @htaccess.
Dans CentOS 6.x, dmidecode ne génère pas d'informations sur le nombre de cœurs/threads, et il considère en fait "CPU" comme "CPU" ou "Core" dans lscpu, pas comme "socket".