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

231

Je souhaitais connaître le nombre de cœurs de mon système. J'ai donc cherché la même question dans Google. J'ai des commandes telles que la lscpucommande. Lorsque j'ai essayé cette commande, cela 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:

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

Lequel de ceux-ci indique les cœurs d'un système Linux?

Existe-t-il une autre commande permettant de connaître le nombre de cœurs, ou est-ce que je suppose que c'est complètement faux?

Mr ASquare
la source
1
ma commande simple pour tous les utilisateurs: $ grep precessor / proc / cpuinfo | wc -l
แนวหน้า
6
Votre image de texte n'est pas très utile . Il ne peut pas être copié dans un éditeur et il indexe mal, ce qui signifie que les autres utilisateurs avec le même problème ont moins de chances de trouver la réponse ici. Veuillez modifier votre message pour incorporer directement le texte pertinent (utilisez de préférence copier + coller pour éviter les erreurs de transcription).
Toby Speight

Réponses:

117

Vous devez examiner 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).

utilisateur1403360
la source
1
J'ai un socket, deux processeurs par socket, donc cela signifie un total de 2. Cependant, il est dit 4 cpus. Si j'essaye nprocje récupère 4. En utilisant cat /proc/cpuinfoje reçois 4, et donc il semble que cette réponse est fausse, du moins pour ma situation.
SPRBRN
14
Pas si vous avez hyper threading. Vous avez toujours 2 cœurs physiques, mais chacun d'eux apparaît deux fois dans / proc / cpuinfo. Si vous examinez attentivement Coreid, vous pouvez voir que chaque coreid est répertorié deux fois. Également sous les drapeaux, vous pouvez voir le drapeau ht.
user1403360
237

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
htaccess
la source
12
Cela devrait être la réponse acceptée
Gansub
2
Je suis d'accord. Cela devrait être la réponse acceptée, car cela explique mieux le sujet.
Rafael
Je pense que l'ajout lscpu --all --extendedserait un ajout utile mais je n'ai plus accès à ces machines particulières.
htaccess
Vous pouvez également éviter awk et une multiplication explicite:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský
@ Jakub Klinkovský, merci de l'avoir signalé, mais dans ce cas, je tiens à démontrer la multiplication de Socket(s) * Core(s) per socket. Compte tenu de ce que je viens de dire, je suppose que ce echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))serait mieux pour que les gens puissent voir exactement ce qui est en train de se multiplier ...
htaccess
62

Vous pouvez obtenir cette information par nproc(1)commande

$ nproc --all
12

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

Anthony Ananich
la source
10
Ceci est incorrect, la sortie de nproc correspond au nombre de processeurs de lscpu. Si vous avez des cœurs multithreads, la sortie de nproc ne correspondra pas au nombre de cœurs que vous avez.
htaccess
2
Pour une solution non root, un hack consisterait à utiliser top et hit 1. Cela indiquera le nombre de cœurs disponibles . Pourquoi j’ai vu «disponible», c’est que le matériel sous-jacent pourrait avoir plus de cœurs, comme un infra nuage.
Hopping Bunny
@htaccess Au moins sur Ubuntu, cela fournit le nombre correct de processeurs logiques en ligne
Wil
1
@htaccess ok je comprends. Habituellement, quand un duffer linux demande combien de cœurs ils veulent dire combien de threads logiques sont disponibles. Techniquement, linux a tort d'appeler les «processeurs» des threads matériels. Votre machine est équipée d’un processeur avec 2 cœurs et 4 threads matériels SMT. Il en résulte une grande ambiguïté dans la signification des processeurs et des cœurs. Mais je comprends ce que tu voulais dire maintenant, ty.
Wil
1
@Wil oui, j'appelle cela dans ma réponse ci-dessus: "Vous devez faire attention au terme" processeur "car il signifie différentes choses dans différents contextes". Personnellement, je ne compare pas les "cœurs" aux unités de traitement logiques mais aux cœurs physiques du processeur (c'est-à-dire les unités de traitement physiques).
htaccess
19

Pour que la réponse ne soit pas source de confusion, vous devez comprendre quelques concepts simples d'architecture informatique:

  • Vous exécutez des processus ("programmes") sur votre système Linux. Chaque processus consiste en un ou plusieurs threads
  • Chaque fil est une séquence d' instructions séparée . Deux threads peuvent être exécutés en parallèle.
  • Chaque instruction est donnée à une CPU pour être exécutée. Un processeur a une logique qui détermine la signification des 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'une CPU envoie les différentes instructions à différentes unités matérielles . Par exemple, les instructions arithmétiques sont en réalité exécutées par une ALU (unité arithmétique / logique), tandis que les instructions qui chargent / stockent à partir de la mémoire sont exécutées par une sorte d' unité de mémoire .

  • Un noyau fait référence à un ensemble de matériel d’exécution (c’est-à-dire que chaque noyau a une ALU, une unité de mémoire, etc.).

  • Vous pouvez avoir plusieurs processeurs partageant un même cœur - on parle alors d’hyperthreading.

    • L'idée: le fil A est en train de faire de l'arithmétique, alors que le fil 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, puis ils devront attendre l’un l’autre ...
  • Un socket est l’emplacement physique de la carte mère dans lequel une puce est insérée. Cette puce a un certain nombre de cœurs.

Exemples:

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 donner des instructions à un noyau (pas d’hyperthreading), ce qui signifie qu’il existe
  • 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 un total de 8 cœurs. Deux threads peuvent donner des instructions à chaque core (cette machine est hyperthreading), ce qui signifie qu'il doit y avoir deux processeurs connectés à chaque core, soit un total de 8 * 2 = 16 CPU

La première machine peut exécuter avec précision quatre instructions à un moment donné, selon la période. La deuxième machine peut exécuter entre 8 et 16 instructions à un moment donné: elle ne sera exécutée que lorsque chaque paire de CPU exécute différents types d'instructions et peut donc partager un cœur sans attendre.

stochastique
la source
14

Vous pouvez également utiliser la commande cat /proc/cpuinfoqui générera 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. Ainsi, si le dernier bloc indique processor : 3comme dans ce cas, votre machine dispose de 4 cœurs.

dr01
la source
Merci cette commande décrivant les informations en détail. :)
M. ASquare
Pour une commande one-liner, vous pouvez utilisergrep -c ^processor /proc/cpuinfo
Wildcard
5
getconf _NPROCESSORS_ONLN

(getconf fait partie de la glibc)

G / D
la source
1
C'est légèrement différent (et utile pour certains besoins). C'est le nombre de processeurs actuellement en ligne (c'est-à-dire disponibles pour les processus en cours d'exécution). Il peut être inférieur au nombre total de processeurs si un ou plusieurs d'entre eux ont été mis hors ligne (par exemple, en mode veille prolongée ou lors de l'ajout / la suppression de processeurs).
Toby Speight
Et getconf _NPROCESSORS_CONFvous obtient le nombre de processeurs configurés. Vous pouvez également obtenir la valeur de ces deux macros dans un code source C, en utilisant la sysconf()fonction. Tapez man sysconfpour plus d'informations.
Galaxy
4
[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
reli
la source
Quel est le t 4rôle de dmidecode? Comment les nombres et les lignes activées se multiplient-ils? Votre exemple montre-t-il 2 cœurs, ou 6, 12, ou 24, ou un autre nombre?
Xen2050
@ Xen2050 4is processor, voir linux.die.net/man/8/dmidecode . Mais utiliser 4comme argument est une mauvaise pratique.
JohnKoch
bash: dmidecode: command not found
Cameron Hudson le
3
$ 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 non.

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

Un autre moyen facile.

jwc
la source
2
C'est simple, mais je ne suis pas sûr que la question soit précise. Il a demandé le nombre de cœurs: (cœurs! = Cpus) si l'hyperthreading est activé. Mon système a 24 cœurs: 48 cpus en hyper-thread. En outre, l’utilisation de la deuxième commande fournie a ls -d /sys/devices/system/cpu/cpu* | wc -lmontré 49 parce qu’il existe un répertoire cpuidleparmi les cpuNrépertoires.
Andrew Falanga
0

J'ai trouvé ça:

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

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 / fils, et considère en réalité "CPU" comme "CPU" ou "Core" dans lscpu, et non "socket".

PickBoy
la source
Si ce n'est pas la réponse, ajoutez ceci comme commentaire.
Mongrel
@Mongrel Je voulais ajouter un commentaire, mais le commentaire requiert 50
points de
-2

La famille du processeur n’est pas pertinente ici.

  • CPU (s) = sockets physique
  • Noyau (s) par socket - comme il est dit
  • donc nombre total de cœurs = CPU (s) * Cœur (s) par socket

Dans votre cas, vous avez un total de 4 noyaux complets.

Ce qui peut aussi être important, c'est "Fil (s) par noyau". Mais vous en avez 1, donc pas dans votre cas.

Tomasz Klim
la source
1
Vous confondez CPU (s) avec Socket (s) dans votre description.
jlliagre
1
Comme jlliagre le dit, c'est inexact. Cores = Cores per socket X Sockets, voir la description dans ma réponse.
htaccess
-3

Un moyen simple de déterminer le nombre de processeurs consiste à exécuter les commandes ci-dessous:

cat /proc/interrupts | egrep -i 'cpu'
Sousa Gaspar
la source
1
Interruptions ou cpuinfo?
Jeff Schaller
Et comptez avec l'option -c?
Jeff Schaller