Wie erkenne ich die Anzahl der Kerne eines Systems unter Linux?

231

Ich wollte herausfinden, wie viele Kerne mein System hat, und habe die gleiche Frage in Google gesucht. Ich habe einige Befehle wie den lscpuBefehl. Als ich diesen Befehl ausprobierte, ergab sich folgendes Ergebnis:

$ 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

Diese Ausgabe zeigt insbesondere:

  • CPU (s): 4
  • Core (s) pro Sockel: 4
  • CPU-Familie: 6

Welche davon gibt die Kerne eines Linux-Systems an?

Gibt es einen anderen Befehl, der die Anzahl der Kerne angibt, oder gehe ich davon aus, dass dies völlig falsch ist?

Herr ASquare
quelle
1
Mein einfacher Befehl für alle Benutzer: $ grep precessor / proc / cpuinfo | wc -l
สมหวัง แนวหน้า
6
Ihr Bild von Text ist nicht sehr hilfreich . Es kann nicht in einen Editor kopiert werden, und der Index ist nicht sehr gut. Dies bedeutet, dass andere Benutzer mit demselben Problem hier mit geringerer Wahrscheinlichkeit die Antwort finden. Bitte bearbeiten Sie Ihren Beitrag, um den relevanten Text direkt einzubeziehen (vorzugsweise mit Kopieren + Einfügen, um Übertragungsfehler zu vermeiden).
Toby Speight

Antworten:

117

Man muss sich Sockel und Adern pro Sockel anschauen. In diesem Fall haben Sie 1 physische CPU (Sockel) mit 4 Kernen (Kerne pro Sockel).

user1403360
quelle
1
Ich habe einen Sockel, zwei CPU pro Sockel, so dass insgesamt 2 bedeuten würde. Es heißt jedoch 4 CPU. Wenn ich es versuche, nprocbekomme ich 4 zurück. Wenn cat /proc/cpuinfoich benutze, erhalte ich 4, und daher scheint diese Antwort für meine Situation zumindest falsch zu sein.
SPRBRN
14
Nicht, wenn Sie Hyper-Threading haben. Sie haben noch 2 physische Kerne, aber jeder Kern wird zweimal in / proc / cpuinfo angezeigt. Wenn Sie unter coreid genau hinschauen, können Sie feststellen, dass Sie jede coreid zweimal aufgelistet haben. Auch unter Flags können Sie die ht-Flagge sehen.
user1403360
237

Um ein vollständiges Bild zu erhalten, müssen Sie die Anzahl der Threads pro Core, Cores pro Socket und Sockets überprüfen . Wenn Sie diese Zahlen multiplizieren, erhalten Sie die Anzahl der CPUs in Ihrem System.

CPUs = Threads pro Core X Cores pro Socket X Sockets

CPUs sehen Sie beim Ausführen htop(diese entsprechen nicht physischen CPUs).

Hier ist ein Beispiel von einem Desktop-Computer:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1

Und ein Server:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2

Die Ausgabe von nprocentspricht der CPU-Zählung von lscpu. Für den Desktop-Computer oben sollte dies mit den 8 CPU (s) übereinstimmen, die gemeldet werden von lscpu:

$ nproc --all
8

Die Ausgabe von /proc/cpuinfosollte mit diesen Informationen übereinstimmen. Auf dem Desktop-System oben sehen wir beispielsweise 8 Prozessoren (CPUs) und 4 Kerne (Kern-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

Der cpu coresgemeldete von /proc/cpuinfoentspricht dem Core(s) per socketgemeldeten von lscpu. Für die Desktop-Maschine oben sollte dies mit den 4 Core (s) pro Socket übereinstimmen, die von lscpu gemeldet werden:

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

Um Ihre Frage spezifisch zu beantworten, sagen Sie, wie viele Kerne Sie haben, indem Sie die Anzahl von Kernen, die Sie pro Sockel haben, mit der Anzahl von Sockeln multiplizieren, die Sie haben.

Adern = Adern pro Sockel X Sockel

Für die obigen Beispielsysteme verfügt der Desktop über 4 Kerne:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4

Während der Server 16 hat:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16

Ein weiteres nützliches Dienstprogramm dmidecodegibt Informationen pro Socket aus. Für das oben aufgeführte Serversystem erwarten wir 8 Cores pro Socket und 16 Threads pro 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

Der lscpuBefehl enthält eine Reihe nützlicher Optionen, die Sie möglicherweise ausprobieren möchten, z.

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

Siehe man lscpufür weitere Einzelheiten.

In Summe:

  • Sie müssen sich der Sockets, Kerne und Threads bewusst sein
  • Sie müssen mit dem Begriff CPU vorsichtig sein, da er in verschiedenen Kontexten unterschiedliche Bedeutungen hat
htaccess
quelle
12
Dies sollte die akzeptierte Antwort sein
gansub
2
Genau. Dies sollte die akzeptierte Antwort sein, da dies das Thema besser erklärt.
Rafael
Ich denke, das Hinzufügen lscpu --all --extendedwäre eine nützliche Ergänzung, aber ich habe keinen Zugriff mehr auf diese speziellen Maschinen.
Zugriff
Sie können auch awk und eine explizite Multiplikation vermeiden:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský
@Jakub Klinkovský, danke für den Hinweis, aber in diesem Fall möchte ich die Multiplikation von demonstrieren Socket(s) * Core(s) per socket. Angesichts dessen, was ich gerade gesagt habe, echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))wäre es
wahrscheinlich
61

Sie können diese Informationen per nproc(1)Befehl abrufen

$ nproc --all
12

Es sind keine Root-Rechte erforderlich.

Anthony Ananich
quelle
10
Dies ist falsch, die Ausgabe von nproc entspricht der CPU-Anzahl von lscpu. Wenn Sie über Multithread-Kerne verfügen, stimmt die Ausgabe von nproc nicht mit der Anzahl Ihrer Kerne überein.
Htaccess
2
Für eine Nicht-Root-Lösung wäre es ein Hack, top und hit 1 zu verwenden. Dies zeigt die Anzahl der verfügbaren Kerne an. Ich habe "verfügbar" gesehen, weil die zugrunde liegende Hardware möglicherweise mehr Kerne wie eine Cloud-Infrastruktur enthält.
Hopping Bunny
@htaccess Zumindest auf Ubuntu, diese gibt die korrekte Anzahl von On-line - logischen CPUs
Wil
1
@htaccess ok ich verstehe. Wenn ein Linux-Duffer nach der Anzahl der Kerne fragt, bedeutet dies normalerweise, wie viele logische Threads verfügbar sind. Technisch gesehen ist es unter Linux falsch, Hardware-Threads als "CPU" zu bezeichnen. Ihr Computer verfügt über 1 CPU mit 2 Kernen und 4 SMT-Hardware-Threads. Infolgedessen ist die Bedeutung von CPUs und Kernen sehr vieldeutig. Aber ich verstehe, was du jetzt gemeint hast.
Wil,
1
@Wil yea Ich nenne dies in meiner Antwort oben: "Sie müssen vorsichtig mit dem Begriff CPU sein, da es verschiedene Dinge in verschiedenen Kontexten bedeutet". Persönlich setze ich "Kerne" nicht mit logischen Verarbeitungseinheiten gleich, sondern mit physischen Kernen im Prozessor (dh den physischen Verarbeitungseinheiten).
Htaccess
19

Damit die Antwort nicht verwirrend ist, müssen Sie einige einfache Computerarchitekturkonzepte verstehen:

  • Sie führen Prozesse ("Programme") auf Ihrem Linux-System aus. Jeder Prozess besteht aus einem oder mehreren Threads
  • Jeder Thread ist eine separate Folge von Anweisungen . Zwei Threads können parallel ausgeführt werden.
  • Jeder Befehl wird an eine CPU übergeben , die ausgeführt werden soll. Eine CPU hat eine Logik, die herausfindet, was die Bits eines Befehls bedeuten und entscheidet, was damit zu tun ist.
  • Es gibt verschiedene Arten von Anweisungen. Die Entscheidungslogik in einer CPU sendet die verschiedenen Anweisungen an verschiedene Hardwareeinheiten . Beispielsweise werden arithmetische Anweisungen tatsächlich von einer ALU (Arithmetik / Logik-Einheit) ausgeführt, während Anweisungen, die aus dem Speicher laden / speichern, von einer Art Speichereinheit ausgeführt werden .

  • Ein Core bezieht sich auf einen Satz von tatsächlicher Ausführungshardware (dh jeder Core hat eine ALU, eine Speichereinheit usw.).

  • Sie können mehrere CPUs haben, die sich einen Kern teilen - dies wird als Hyperthreading bezeichnet.

    • Die Idee: Thread A rechnet gerade, während Thread B etwas aus dem Speicher lädt. Wenn dies zutrifft, können die Threads A und B einen einzelnen Kern effizient gemeinsam nutzen, ohne sich gegenseitig zu behindern (A verwendet die ALU, B verwendet die Speichereinheit). Natürlich wollen manchmal beide Programme die ALU, und dann müssen sie aufeinander warten ...
  • Ein Sockel ist der physische Steckplatz auf der Hauptplatine, in den ein Chip eingesetzt wird. Auf diesem Chip befindet sich eine bestimmte Anzahl von Kernen.

Beispiele:

Das Beispiel des OP:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • ein physikalischer Sockel, der einen Chip mit enthält
  • 4 physische Kerne (4 ALUs und 4 Speichereinheiten insgesamt)
  • Nur 1 Thread kann Anweisungen an einen Core senden (kein Hyperthreading), was bedeutet, dass es Anweisungen gibt
  • eine CPU pro Kern oder 4 * 1 = 4 CPUs

Ein anderes Beispiel:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

Zwei physische Sockel, die jeweils einen Chip mit 4 physischen Kernen enthalten, sodass insgesamt 8 Kerne vorhanden sind. Zwei Threads geben Anweisungen an jeden Kern aus (dieser Computer verfügt über Hyperthreading). Dies bedeutet, dass an jeden Kern zwei CPUs angeschlossen sein müssen, was insgesamt 8 * 2 = 16 CPUs ergibt

Die erste Maschine kann zu einem bestimmten Zeitpunkt genau vier Befehle ausführen. Die zweite Maschine kann zu einem bestimmten Zeitpunkt zwischen 8 und 16 Befehle ausführen: 16 werden nur dann erreicht, wenn jedes CPU-Paar unterschiedliche Befehlstypen ausführt, und können so einen Kern gemeinsam nutzen, ohne zu warten.

stochastisch
quelle
14

Sie können auch den Befehl verwenden, cat /proc/cpuinfoder einen Datenblock für jeden Kern ausgibt. Jeder Block beginnt mit diesen Informationen:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)

Kerne werden ab 0 nummeriert. Wenn also der letzte Block processor : 3wie in diesem Fall lautet , verfügt Ihr Computer über 4 Kerne.

dr01
quelle
Vielen Dank für diesen Befehl, der die Informationen ausführlich beschreibt. :)
Herr ASquare
Für einen einzeiligen Befehl können Siegrep -c ^processor /proc/cpuinfo
Wildcard
5
getconf _NPROCESSORS_ONLN

(getconf ist ein Teil von glibc)

LR
quelle
1
Das ist etwas anders (und nützlich für einige Bedürfnisse). Dies ist die Anzahl der Prozessoren, die jetzt online sind (dh für die Ausführung von Prozessen verfügbar sind). Es kann weniger als die Gesamtzahl der CPUs sein, wenn eine oder mehrere CPUs offline geschaltet wurden (z. B. im Ruhezustand oder beim Hinzufügen / Entfernen von Prozessoren).
Toby Speight
Und getconf _NPROCESSORS_CONFSie erhalten die Anzahl der konfigurierten Prozessoren. Sie können den Wert dieser beiden Makros auch innerhalb eines C-Quellcodes abrufen, indem Sie die sysconf()Funktion verwenden. Geben Sie man sysconffür weitere Informationen ein.
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
Vertrauen
quelle
Was t 4macht dmidecode? Wie multiplizieren sich die Zählwerte und aktivierten Zeilen? Zeigt Ihr Beispiel 2 Kerne oder 6 oder 12 oder 24 oder eine andere Zahl?
Xen2050
@ Xen2050 4ist processor, siehe linux.die.net/man/8/dmidecode . Die Verwendung 4als Argument ist jedoch eine schlechte Praxis.
JohnKoch
bash: dmidecode: command not found
Cameron Hudson
3
$ grep -c processor /proc/cpuinfo
8

Das ist alles was du brauchst. Dies ist die Anzahl der Online-Kerne, unabhängig davon, ob das Hyperthreading aktiviert oder deaktiviert ist.

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

Ein anderer einfacher Weg.

jwc
quelle
2
Das ist einfach, aber ich bin mir nicht sicher, ob es der Frage entspricht. Er fragte nach der Anzahl der Kerne: (Kerne! = CPU), ob Hyperthreading aktiviert ist. Mein System hat 24 Kerne: 48 CPU, wenn Hyper-Threaded. Auch, sofern der zweite Befehl ls -d /sys/devices/system/cpu/cpu* | wc -lzeigte 49 , weil es ein Verzeichnis ist cpuidleunter den cpuNVerzeichnissen.
Andrew Falanga
0

Ich habe diesen Weg gefunden:

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

Ich möchte nur einige Informationen zu @htaccess 'Antwort hinzufügen.

In CentOS 6.x gibt dmidecode keine Informationen zur Anzahl der Kerne / Threads aus und betrachtet 'CPU' tatsächlich als 'CPU' oder 'Core' in lscpu, nicht als 'Socket'.

PickBoy
quelle
Wenn dies nicht die Antwort ist, fügen Sie dies als Kommentar hinzu.
Mischling
@Mongrel Ich wollte als Kommentar hinzufügen, aber das Kommentieren erfordert 50 Ruf
PickBoy
-2

Die CPU-Familie spielt hier keine Rolle.

  • CPU (s) = physische Sockets
  • Core (s) pro Socket - wie es heißt
  • so Gesamtzahl der Kerne = CPU (s) * Core (s) pro Buchse

In Ihrem Fall haben Sie insgesamt 4 volle Kerne.

Was auch wichtig sein kann, ist "Thread (s) pro Kern". Aber du hast 1, also nicht in deinem Fall.

Tomasz Klim
quelle
1
Sie verwechseln CPU (s) mit Sockel (s) in Ihrer Beschreibung.
Juli
1
Wie jlliagre sagt, ist das falsch. Cores = Cores per socket X SocketsSiehe die Beschreibung in meiner Antwort.
Htaccess
-3

Eine einfache Möglichkeit, die Anzahl der CPUs zu ermitteln, besteht darin, die folgenden Befehle auszuführen:

cat /proc/interrupts | egrep -i 'cpu'
Sousa Gaspar
quelle
1
Interrupts oder cpuinfo?
Jeff Schaller
Und mit der Option -c zählen?
Jeff Schaller