web-dev-qa-db-fra.com

Comment connaître le nombre de cœurs d'un système sous Linux?

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:

  • Processeur (s): 4
  • Noyau (s) par socket: 4
  • Famille de CPU: 6

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?

254
Mr ASquare

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).

124
user1403360

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 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
251
htaccess

Vous pouvez obtenir ces informations par la commande nproc(1)

$ nproc --all
12

Il ne nécessite pas de privilèges root.

61
Anthony Ananich

Pour que la réponse ne prête pas à confusion, vous devez comprendre quelques concepts d'architecture informatique simples:

  • Vous exécutez processus ("programmes") sur votre système Linux. Chaque processus consiste en un ou plusieurs threads
  • Chaque thread est une séquence distincte de instructions. Deux threads peuvent être exécutés en parallèle.
  • Chaque instruction est donnée à un CPU à exécuter. Un processeur possède une logique qui détermine ce que signifient les bits d'une instruction et décide quoi en faire.
  • 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.

    • L'idée: le thread A fait actuellement de l'arithmétique, tandis que le thread B charge quelque chose de la mémoire. Lorsque cela est vrai, les threads A et B peuvent partager efficacement un seul cœur sans se gêner mutuellement (A utilise l'ALU, B utilise l'unité de mémoire). Bien sûr, parfois les deux programmes voudront l'ALU, et ensuite ils doivent s'attendre ...
  • 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.

Exemples:

L'exemple du PO:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • une prise physique, qui contient une puce avec
  • 4 cœurs physiques (pensez à 4 ALU et 4 unités de mémoire au total)
  • Un seul thread peut envoyer des instructions à un noyau (pas d'hyperthreading), ce qui signifie qu'il y a
  • un processeur par cœur, ou 4 * 1 = 4 processeurs

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.

23
stochastic

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.

14
dr01
getconf _NPROCESSORS_ONLN

(getconf fait partie de la glibc)

7
L.R.
$ 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.

4
jwc
[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
4
reli

J'ai trouvé ça:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
1
Serge Roussak

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".

0
PickBoy