684 Stimmen

Wie erhält man die Anzahl der CPUs/Kerne in Linux über die Befehlszeile?

Ich habe dieses Skript, aber ich weiß nicht, wie ich das letzte Element im Ausdruck erhalten kann:

cat /proc/cpuinfo | awk '/^processor/{print $3}'

Das letzte Element sollte die Anzahl der CPUs minus 1 sein.

15 Stimmen

Das müssen Sie nicht cat antes de awk trotzdem: einfach awk '<script>' /proc/cpuinfo und so weiter: awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo . Und du kommst ohne "minus eins" rein.

2 Stimmen

Um die Frage direkt zu beantworten, leiten Sie das nach tail -n 1 der die letzte Zeile übernimmt und ausgibt.

1 Stimmen

820voto

uckelman Punkte 24070

Verarbeitung des Inhalts von /proc/cpuinfo ist unnötig barock. Verwenden Sie nproc das Teil der coreutils ist, sollte also auf den meisten Linux-Installationen verfügbar sein.

Befehl nproc gibt die Anzahl der für den aktuellen Prozess verfügbaren Verarbeitungseinheiten aus, die geringer sein kann als die Anzahl der Online-Prozessoren.

Um die Anzahl aller installierten Kerne/Prozessoren zu ermitteln, verwenden Sie nproc --all

Auf meinem 8-Kern-Rechner:

$ nproc --all
8

801voto

unbeli Punkte 28027
grep -c ^processor /proc/cpuinfo

zählt die Anzahl der Zeilen, die mit "processor" in /proc/cpuinfo

Für Systeme mit Hyper-Threading können Sie

grep ^cpu\\scores /proc/cpuinfo | uniq |  awk '{print $4}'

die (zum Beispiel) Folgendes zurückgeben sollte 8 (wohingegen der obige Befehl Folgendes zurückgeben würde 16 )

319voto

mshildt Punkte 8292

Die tragbarste Lösung, die ich gefunden habe, ist die getconf Befehl:

getconf _NPROCESSORS_ONLN

Dies funktioniert sowohl unter Linux als auch unter Mac OS X. Ein weiterer Vorteil gegenüber anderen Ansätzen ist, dass es getconf schon seit langem gibt. Einige der älteren Linux-Maschinen, auf denen ich entwickeln muss, haben nicht die nproc o lscpu Befehle zur Verfügung, aber sie haben getconf .

Anmerkung der Redaktion: Während die getconf Dienstprogramm ist POSIX-mandatiert die spezifische _NPROCESSORS_ONLN y _NPROCESSORS_CONF Werte sind es nicht. Wie bereits erwähnt, funktionieren sie sowohl auf Linux-Plattformen als auch auf macOS; auf FreeBSD/PC-BSD müssen Sie das führende _ .

141voto

mklement0 Punkte 303096

Vorwort:

  • En Problem mit dem /proc/cpuinfo -basierte Antworten ist, dass sie Informationen auswerten, die eigentlich für menschlich Verbrauch und damit kein stabiles Format für maschinelles Parsing : Das Ausgabeformat kann sich je nach Plattform und Laufzeitbedingungen unterscheiden; mit lscpu -p unter Linux (und sysctl unter macOS) umgeht dieses Problem .

  • getconf _NPROCESSORS_ONLN / getconf NPROCESSORS_ONLN unterscheidet nicht zwischen logisch y physisch CPUs.


Hier ist ein sh (POSIX-kompatibles) Snippet, das unter folgenden Bedingungen funktioniert Linux und macOS zur Bestimmung der Anzahl der - online - logisch o physisch CPUs ; siehe die Kommentare für Details.

Verwendet lscpu für Linux, und sysctl für macOS.

Anmerkung zur Terminologie : CPU bezieht sich auf die kleinste Verarbeitungseinheit, wie sie vom Betriebssystem gesehen wird. Nicht-Hyperthreading-Kerne entsprechen jeweils einer CPU, während Hyperthreading-Kerne mehr als eine (typischerweise 2) - logische - CPU enthalten.
Linux verwendet die folgende Taxonomie [1] , beginnend mit der kleinsten Einheit:
CPU < Kernstück < Steckdose < Buch < Knoten
wobei jede Ebene 1 oder mehrere Instanzen der nächst niedrigeren Ebene umfasst.

#!/bin/sh

# macOS:           Use `sysctl -n hw.*cpu_max`, which returns the values of 
#                  interest directly.
#                  CAVEAT: Using the "_max" key suffixes means that the *maximum*
#                          available number of CPUs is reported, whereas the
#                          current power-management mode could make *fewer* CPUs 
#                          available; dropping the "_max" suffix would report the
#                          number of *currently* available ones; see [1] below.
#
# Linux:           Parse output from `lscpu -p`, where each output line represents
#                  a distinct (logical) CPU.
#                  Note: Newer versions of `lscpu` support more flexible output
#                        formats, but we stick with the parseable legacy format 
#                        generated by `-p` to support older distros, too.
#                        `-p` reports *online* CPUs only - i.e., on hot-pluggable 
#                        systems, currently disabled (offline) CPUs are NOT
#                        reported.

# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)
  # Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, 
  # which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname) = 'Darwin' ] && 
                       sysctl -n hw.logicalcpu_max || 
                       lscpu -p | egrep -v '^#' | wc -l)

# Number of PHYSICAL CPUs (cores).
  # Linux: The 2nd column contains the core ID, with each core ID having 1 or
  #        - in the case of hyperthreading - more logical CPUs.
  #        Counting the *unique* cores across lines tells us the
  #        number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname) = 'Darwin' ] && 
                       sysctl -n hw.physicalcpu_max ||
                       lscpu -p | egrep -v '^#' | sort -u -t, -k 2,4 | wc -l)

# Print the values.
cat <<EOF
# of logical CPUs:  $logicalCpuCount
# of physical CPUS: $physicalCpuCount
EOF

[1] macOS sysctl (3) Dokumentation

Beachten Sie, dass andere von BSD abgeleitete Systeme als macOS - z. B. FreeBSD - nur die Option hw.ncpu Schlüssel für sysctl die unter macOS veraltet sind; ich bin mir nicht sicher, welche der neuen Tasten hw.npu entspricht: hw.(logical|physical)cpu_[max] .

Hut ab vor @teambob für seine Hilfe bei der Korrektur der physikalischen CPU-Zahl lscpu Befehl.

Caveat : lscpu -p Die Ausgabe enthält KEINE Spalte "Buch" (die man Seite erwähnt "Bücher" als eine Entität zwischen Sockel und Knoten in der taxonomischen Hierarchie). Wenn "books" auf einem bestimmten Linux-System im Spiel sind ( Weiß jemand, wann und wie? ), kann der Befehl physical-CPU-count unter -Bericht (dies basiert auf der Annahme, dass lscpu meldet IDs, die nicht eindeutig sind zwischen übergeordneten Einheiten z.B.: 2 verschiedene Kerne von 2 verschiedenen Sockeln können die gleiche ID haben).


Wenn Sie den obigen Code z. B. als Shell-Skript speichern cpus , machen Sie es ausführbar mit chmod +x cpus und legen Sie sie in einem Ordner in Ihrem $PATH erhalten Sie eine Ausgabe wie die folgende:

$ cpus
logical  4
physical 4

[1] Xaekai erhellt, was ein Buch ist: "a Buch ist ein Modul, das eine Leiterplatte mit CPU-Sockeln, RAM-Sockeln, IO-Anschlüssen am Rand und einem Haken für die Integration des Kühlsystems enthält. Sie werden in IBM-Mainframes verwendet. Weitere Informationen: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "

49voto

Sh4msi Punkte 872

lscpu sammelt Informationen zur CPU-Architektur aus /proc/cpuinfon in einem für Menschen lesbaren Format:

# lscpu

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    4
CPU socket(s):         2
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 15
Stepping:              7
CPU MHz:               1866.669
BogoMIPS:              3732.83
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7

Siehe auch https://unix.stackexchange.com/questions/468766/understanding-output-of-lscpu .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X