Vorwort:
Das Problem bei den /proc/cpuinfo
Antworten auf der Basis besteht darin, dass sie Informationen analysieren, die für den menschlichen Verzehr bestimmt waren, und daher kein stabiles Format für das Parsen von Maschinen aufweisen : Das Ausgabeformat kann je nach Plattform und Laufzeitbedingungen unterschiedlich sein. Die Verwendung lscpu -p
unter Linux (und sysctl
unter MacOS) umgeht dieses Problem .
getconf _NPROCESSORS_ONLN
Ich getconf NPROCESSORS_ONLN
unterscheide nicht zwischen logischen und physischen CPUs.
Hier ist ein sh
(POSIX-kompatibles) Snippet, das unter Linux und MacOS funktioniert, um die Anzahl der - online - logischen oder physischen CPUs zu bestimmen . Einzelheiten finden Sie in den Kommentaren.
Verwendet lscpu
für Linux und sysctl
für MacOS.
Terminologie-Hinweis : CPU bezieht sich auf die kleinste Verarbeitungseinheit, wie sie vom Betriebssystem gesehen wird. Nicht-Hyper-Threading-Kerne entsprechen jeweils 1 CPU, während Hyper-Threading-Kerne mehr als 1 (normalerweise: 2) - logische - CPU enthalten.
Linux verwendet die folgende Taxonomie [1] , beginnend mit der kleinsten Einheit:
CPU < Kern < Socket < Buch < Knoten,
wobei jede Ebene 1 oder mehr Instanzen der nächstniedrigeren 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 von BSD abgeleitete Systeme außer macOS - z. B. FreeBSD - nur den hw.ncpu
Schlüssel für unterstützen sysctl
, der unter macOS veraltet ist. Ich bin mir nicht sicher, welcher der neuen Schlüssel hw.npu
entspricht : hw.(logical|physical)cpu_[max]
.
Tipp an @teambob für die Korrektur des Befehls für die Anzahl der physischen CPUs lscpu
.
Vorsichtsmaßnahme : Die lscpu -p
Ausgabe enthält KEINE "Buch" -Spalte (auf der man
Seite werden "Bücher" als Entität zwischen Socket und Knoten in der taxonomischen Hierarchie erwähnt). Wenn auf einem bestimmten Linux-System "Bücher" im Spiel sind ( weiß jemand wann und wie? ), Wird der Befehl für die Anzahl der physischen CPUs möglicherweise unter -report gemeldet (dies basiert auf der Annahme, dass lscpu
IDs gemeldet werden , die über höhere nicht eindeutig sind Entitäten auf -ebene , z. B.: 2 verschiedene Kerne aus 2 verschiedenen Sockets können dieselbe ID haben.
Wenn Sie den obigen Code beispielsweise als Shell-Skript speicherncpus
, ihn ausführbar machen chmod +x cpus
und in einem Ordner in Ihrem Ordner ablegen $PATH
, wird folgende Ausgabe angezeigt:
$ cpus
logical 4
physical 4
[1] Xaekai beleuchtet, was ein Buch ist: "Ein Buch ist ein Modul, das eine Leiterplatte mit CPU-Sockeln, RAM-Sockeln, E / A-Verbindungen entlang der Kante und einem Haken für die Kühlsystemintegration enthält. Sie werden in IBM-Mainframes verwendet Weitere Informationen: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
cat
vorherawk
: einfachawk '<script>' /proc/cpuinfo
so :awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. Und Sie steigen ohne "minus eins" ein.