Wie finde ich die Anzahl der * logischen * Kerne unter Mac OS X?

382

Wie können Sie über die Befehlszeile erkennen, wie viele Kerne sich auf dem Computer befinden, wenn Sie Mac OS X ausführen? Unter Linux verwende ich:

x=$(awk '/^processor/ {++n} END {print n+1}' /proc/cpuinfo)

Es ist nicht perfekt, aber es ist nah. Dies soll zugeführt werden make, weshalb es ein Ergebnis 1 gibt, das höher als die tatsächliche Anzahl ist. Und ich weiß, dass der obige Code in Perl dichter geschrieben werden kann oder mit grep, wc und cut geschrieben werden kann, aber ich entschied, dass der obige ein guter Kompromiss zwischen Prägnanz und Lesbarkeit war.

SEHR SPÄTE BEARBEITUNG: Nur zur Verdeutlichung: Ich frage, wie viele logische Kerne verfügbar sind, da dies der Anzahl der gleichzeitigen Jobs entspricht, die ich erzeugen möchte make. Die Antwort von jkp, die von Chris Lloyd weiter verfeinert wurde, war genau das , was ich brauchte. YMMV.

Mike DeSimone
quelle
Für Linux muss ich keine hinzufügen, indem ich grep ^processor /proc/cpuinfo | wc -l
Folgendes
3
Siehe stackoverflow.com/questions/6481005/… Beachten Sie den nprocBefehl.
Mike DeSimone
Entschuldigung, wenn dies eine Noob-Frage ist, aber wenn Sie logische Kerne meinen, meinen Sie physische Kerne? Wie unterscheiden sich die Begriffe (oder nicht)? Nur um zu verstehen, was Sie besser fragen.
Charlie Parker
Nein, ich meine nicht physische Kerne. Ein physikalischer Kern ist eine Gruppe von Transistoren auf einem Chip, der einen Kern implementiert. Ein logischer Kern scheint ein Kern des Betriebssystems und der Benutzerprogramme zu sein. In den meisten Fällen sind diese gleich. Die Hyperthreading-Technologie von Intel (und möglicherweise auch andere) lässt jedoch jeden physischen Kern als zwei logische Kerne erscheinen.
Mike DeSimone

Antworten:

797

Sie können dies mit dem Dienstprogramm sysctl tun :

sysctl -n hw.ncpu
jkp
quelle
6
Auf einem 1,7-GHz-MacBook Air Mitte 2011 lautet dieser Befehl 4. Allerdings habe ich vermutet, dass es wirklich nur 2 Kerne hat, und system_profiler SPHardwareDataType scheint dem zuzustimmen. Können Sie die Diskrepanz erklären?
Joshua Flanagan
13
@JoshuaFlanagan Wie viele physische Kerne hat die Maschine und welcher Chip ist das? Wenn es sich beispielsweise um einen Core i7 mit 2 physischen Kernen handelt, wird er als 4 angezeigt, da der Chip Hyper-Threading unterstützt und sich dem Betriebssystem so präsentiert, als ob er 4 adressierbare Kerne hat.
JKP
142
Wenn Sie sich wirklich interessieren, versuchen Sie sysctl hw.physicalcpuoder sysctl hw.logicalcpuund im Allgemeinen sysctl hwfür alle Optionen.
Variabler Längencodierer
23
Redaktion: Bitte ändern Sie die Antwort nicht Jahre nachdem ich sie akzeptiert habe.
Mike DeSimone
2
Funktioniert nicht auf Mac Anfang 2015 mit El Capitan. Ich erhalte "Fehler:" hw.ncpu "ist ein unbekannter Schlüssel". Es gibt auch keinen CPU-bezogenen Eintrag in /etc/sysctl.conf. Die Antwort von Frozen Flame funktionierte.
TheGT
130

Sogar einfacher:

sysctl -n hw.ncpu
mlbright
quelle
2
Die von diesem gemeldete Anzahl ist tatsächlich doppelt so hoch wie die Anzahl der Kerne, die Ihr Prozessor für Hyper-Threading unterstützt.
Mikeazo
3
Dies gibt mir 4, aber wenn ich benutze system_profiler SPHardwareDataType, kann ich glauben, `Modell-ID: MacBookPro9,2 Prozessorname: Intel Core i5 Prozessor Geschwindigkeit: 2,5 GHz Anzahl der Prozessoren: 1 Gesamtzahl der Kerne: 2`
Ciasto piekarz
31

Dies sollte plattformübergreifend sein. Zumindest für Linux und Mac OS X.

python -c 'import multiprocessing as mp; print(mp.cpu_count())'

Ein bisschen langsam, funktioniert aber.

Gefrorene Flamme
quelle
18

Dazu können Sie in C die Funktionsfamilie sysctl (3) verwenden:

int count;
size_t count_len = sizeof(count);
sysctlbyname("hw.logicalcpu", &count, &count_len, NULL, 0);
fprintf(stderr,"you have %i cpu cores", count);

Interessante Werte anstelle von "hw.logicalcpu", das Kerne zählt, sind:

hw.physicalcpu - The number of physical processors available in the current power management mode.

hw.physicalcpu_max - The maximum number of physical processors that could be available this boot.

hw.logicalcpu - The number of logical processors available in the current power management mode.

hw.logicalcpu_max - The maximum number of logical processors that could be available this boot.
alfwatt
quelle
Mike, danke für die Bearbeitung, wusste nicht, dass Oldplen ein In-Out-Parameter ist.
Alfwatt
14

system_profiler SPHardwareDataType zeigt, ich habe 1 Prozessor und 4 Kerne.

[~] system_profiler SPHardwareDataType
Hardware:

    Hardware Overview:

      Model Name: MacBook Pro
      Model Identifier: MacBookPro9,1
      Processor Name: Intel Core i7
      Processor Speed: 2.6 GHz
      Number of Processors: 1
      Total Number of Cores: 4

      <snip>

[~] 

Sysctl ist jedoch anderer Meinung:

[~] sysctl -n hw.logicalcpu
8
[~] sysctl -n hw.physicalcpu
4
[~] 

Aber sysctl scheint korrekt zu sein. Wenn ich ein Programm ausführe, das alle CPU-Steckplätze belegen soll, dauert dieses Programm fast 800% der CPU-Zeit (in top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
user1706991
quelle
3
Sie sehen Hyperthreading bei der Arbeit. Auf diese Weise kann jeder Kern zwei Ausführungsthreads verarbeiten (nicht unbedingt mit Betriebssystemthreads wie z. B. pthreads identisch). Infolgedessen behandelt MacOS jeden physischen Kern als zwei logische Kerne.
Mike DeSimone
Hallo @MikeDeSimone, können Sie mir zeigen, wie ich überprüfen kann, ob Hyper-Threading bei CentOS funktioniert?
Ciasto piekarz
@Ciastopiekarz Ich bin mir ziemlich sicher, dass Hyper-Threading ein Merkmal der CPU-Architektur (Intel) ist und nicht etwas, was das Betriebssystem tut. Ich denke, der springende Punkt ist, das Betriebssystem glauben zu lassen, dass es physische CPU: sx 2-logische Kerne hat, ohne etwas tun zu müssen speziell, um auf sie zuzugreifen. Wenn Ihre CPU also ein Intel ist (alle Macs werden mit Intel geliefert), haben Sie Hyper-Threading. Wenn Sie jedoch CentOS auf einem PC ausführen, verfügen Sie möglicherweise über einen AMD-Prozessor. Sie haben kein Hyper-Threading, aber da sie normalerweise doppelt so viele Kerne zum gleichen (oder niedrigeren) Preis haben, bin ich mir nicht sicher, ob es einen praktischen Unterschied gibt.
Erk
@Erk Das Betriebssystem kennt den Unterschied, tatsächlich kennt es den Unterschied zwischen CPUs und Cores sowie mehrere Threads, die auf einem physischen ausgeführt werden. sysctl hw.physicalcpuzeigt an, wie viele physische CPU-Kerne Ihnen zur Verfügung stehen, sysctl hw.logicalcpuzeigt an, wie viele logische CPUs Ihnen zur Verfügung stehen. Betriebssysteme wie Windows / OSX / Linux sorgen dafür, dass es so aussieht, als hätten Sie mehrere CPUs (unabhängig davon, um welchen Typ es sich handelt). Mit Betriebssystemen wie Linux können Sie konfigurieren, welche CPU, Kerne und Threading verwendet werden können.
Rahly
10
$ system_profiler | grep 'Total Number Of Cores'
Kent
quelle
2
schneller: $ system_profiler SPHardwareDataType | grep 'Gesamtzahl der Kerne'
Kent
6
langsamer, wenn Sie die Eingabezeit einbeziehen
High Performance Mark
2
Es ist in einem Bash-Skript; Die Eingabezeit spielt keine Rolle.
Mike DeSimone
3
Es scheint, als hätte Apple die Formatierung der Ausgabe geändert. Beachten Sie die Großschreibung: Früher war 'Gesamtzahl der Kerne', jetzt ist es 'Gesamtzahl der Kerne' ... entweder das oder ich habe es vorher nur falsch eingegeben ... Entschuldigung!
Kent
3
Sie könnten verwendengrep -i
Skylar Saveland
8

Verwenden Sie die system_profiler | grep "Cores" Befehl.

Ich habe ein:

MacBook Pro Retina, Mitte 2012.

Prozessor: 2,6 GHz Intel Core i7

user$ system_profiler | grep "Cores"
      Total Number of Cores: 4

user$ sysctl -n hw.ncpu
8

Laut Wikipedia ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) gibt es keinen Core i7 mit 8 physischen Kernen, daher muss die Hyperthreading- Idee der Fall sein. Ignorieren sysctlund verwenden Sie diesystem_profiler Wert für die Genauigkeit. Die eigentliche Frage ist, ob Sie Anwendungen mit 4 Kernen (lange Kompilierungsjobs?) Effizient ausführen können, ohne andere Prozesse zu unterbrechen.

Das Ausführen eines mit 4 Kernen parallelisierten Compilers scheint die regulären Betriebssystemvorgänge nicht dramatisch zu beeinträchtigen. Vielleicht ist es gar nicht so schlecht, es als 8 Kerne zu behandeln.

NetworkN8
quelle
1
Das Laichen einer Anzahl von Prozessen, die der Anzahl der logischen Kerne entspricht (doppelt so viele physische Kerne wie bei HyperThreading, wie Sie bemerken), hat sich für mich recht gut bewährt.
Mike DeSimone
7

Wie jkp in einem Kommentar sagte, zeigt dies nicht die tatsächliche Anzahl der physischen Kerne an. Um die Anzahl der physischen Kerne zu ermitteln, können Sie den folgenden Befehl verwenden:

system_profiler SPHardwareDataType
Um versteckte
quelle
Das Ziel war es zu bestimmen, mit wie vielen Prozessen erzeugt werden soll make, damit die Antwort von jkp (Anzahl der logischen Kerne) am besten passt.
Mike DeSimone
3

Der folgende Befehl gibt Ihnen alle Informationen zu Ihrer CPU

$ sysctl -a | sort | grep cpu
Asmaier
quelle
Schön, aber nicht was gefragt wurde.
Mike DeSimone
1

KLÄRUNG

Als diese Frage gestellt wurde, sagte das OP nicht, dass er die Anzahl der logischen Kerne anstelle der tatsächlichen Anzahl der Kerne haben wollte, daher antwortet diese Antwort logisch (kein Wortspiel beabsichtigt) mit einer Möglichkeit, die tatsächliche Anzahl der realen physischen Kerne zu erhalten, nicht Die Nummer, die das Betriebssystem versucht, durch Hyperthreading-Voodoo zu virtualisieren.

UPDATE ZUR BEHANDLUNG VON FLAW IN YOSEMITE

Aufgrund eines seltsamen Fehlers in OS X Yosemite (und möglicherweise neueren Versionen wie dem kommenden El Capitan) habe ich eine kleine Änderung vorgenommen. (Die alte Version hat immer noch einwandfrei funktioniert, wenn Sie STDERR einfach ignorieren, was alles ist, was die Modifikation für Sie tut.)


Jede andere Antwort hier auch

  1. gibt falsche Informationen
  2. gibt aufgrund eines Fehlers in der Befehlsimplementierung keine Informationen
  3. läuft unglaublich langsam (dauert fast eine Minute ) oder
  4. gibt zu viele Daten an und kann daher für die interaktive Verwendung nützlich sein, ist jedoch nutzlos, wenn Sie die Daten programmgesteuert verwenden möchten (z. B. als Eingabe für einen Befehl, bundle install --jobs 3bei dem die Nummer anstelle von 3eins kleiner als die Nummer sein soll Anzahl der Kerne, die Sie haben, oder zumindest nicht mehr als die Anzahl der Kerne)

Der Weg, um nur die Anzahl der Kerne zuverlässig, korrekt, relativ schnell und ohne zusätzliche Informationen oder sogar zusätzliche Zeichen um die Antwort zu erhalten, ist folgender:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
Bilderstürmer
quelle
3
Ich bin gerade sysctl -n hw.ncpuauf meinem Mac Pro gelaufen und hatte keines dieser Probleme.
Mike DeSimone
Ich habe natürlich nicht auf allen Mac-Typen getestet, aber ich glaube Ihnen, dass es manchmal genau ist. Gibt sysctljedoch keine genauen Ergebnisse auf meinem Computer, und andere haben das gleiche gemeldet. Wenn man sich nicht darauf verlassen kann, dass immer genaue Ergebnisse erzielt werden, kann dies nicht als zuverlässig und genau angesehen werden.
Bilderstürmer
Sie können auch das fehlerhafte Verhalten erklären, das Sie sehen, und auf welchen Plattformen Sie es sehen, damit die Grenzen des sysctlordnungsgemäßen Betriebs besser bekannt sind, wie dies bei user1706991 der Fall war.
Mike DeSimone
Andere haben vorgeschlagen, dass dies auf Hyper-Threading zurückzuführen ist. Die Anzahl, die Sie mit sysctl sehen, ist also die Anzahl der Kerne, die das System zu simulieren versucht, obwohl es tatsächlich nicht so viele gibt. Wenn Sie genaue Zahlen wünschen, verwenden Sie meine Methode. Wenn Sie wissen möchten, wie viele Kerne der Computer vorgibt, verwenden Sie sysctl.
Bilderstürmer
@iconoclast Beim Testen habe ich festgestellt, dass 'Total Number of Cores' lokalisiert ist. Wenn OS X auf etwas anderes als Englisch eingestellt ist, schlägt Ihre Lösung fehl. Endete mit:sysctl -n hw.physicalcpu_max
CO
1

Auf einem MacBook Pro mit Maverick , sysctl -a | grep hw.cpunur ein paar kryptischen Details zurück. Viel detailliertere und zugänglichere Informationen finden Sie in diesem machdep.cpuAbschnitt:

sysctl -a | grep machdep.cpu

Insbesondere bei Prozessoren mit HyperThreading(HT) wird die Gesamtzahl der aufgelisteten CPUs ( logical_per_package) doppelt so hoch wie die Anzahl der physischen Kerne ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
Karl Ehr
quelle
Auf meinem Mac Pro Anfang 2008 habe ich 4 Punkte. Die tatsächliche Anzahl der Kerne beträgt 8, da er über zwei Quad-Core-CPU-Chips verfügt.
Mike DeSimone
sysctl machdep.cpu funktioniert auch, anstatt alle anderen unnötigen Informationen zu lesen.
hsn
1

Es wurde in der ursprünglichen Frage nicht angegeben (obwohl ich OP-Beiträge in Kommentaren gesehen habe, dass dies keine Option war), aber viele Entwickler unter macOS haben den Homebrew-Paketmanager installiert.

Für zukünftige Entwickler, die über diese Frage stolpern, nprocist eine der im coreutilsPaket enthaltenen allgemeinen GNU-Binärdateien eine der gängigen GNU-Binärdateien, sofern die Annahme (oder Anforderung) der Installation von Homebrew besteht (z. B. in einer technischen Organisation in einem Unternehmen) .

brew install coreutils

Wenn Sie Skripte haben, die Sie lieber einmal (für Linux + macOS) als zweimal schreiben möchten, oder um ifBlöcke zu vermeiden, in denen Sie das Betriebssystem erkennen müssen, um zu wissen, ob Sie nprocvs aufrufen sollen oder nicht sysctl -n hw.logicalcpu, ist dies möglicherweise eine bessere Option.

Ryan Parman
quelle
0

Kommentare für 2 gute Antworten oben:

1) Bezüglich der akzeptierten Antwort (und Kommentare) von jkp: hw.ncpu wird offenbar zugunsten von hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594) abgelehnt )

2) Zum Update 2014 von Karl Ehr: Auf meinem Computer (mit 2,5 GHz Intel Core i7) werden sysctl -a | grep machdep.cpu | grep per_packageunterschiedliche Zahlen zurückgegeben:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Die gewünschten Werte sind:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Welches Spiel:

hw.physicalcpu: 4

hw.logicalcpu: 8

Kennzeichen
quelle
0

Dies kann auf tragbarere Weise erfolgen:

$ nproc --all
32

Kompatibel mit macOS und Linux.

Jay Taylor
quelle
2
nprocscheint unter macOS Mojave nicht verfügbar zu sein.
Mike DeSimone
Danke, dass du mich informiert hast, Mike. nprocist eine triviale Installation durch Homebrew.
Jay Taylor
Das System, das ich ausgeführt habe, wurde vom Internet getrennt, daher hilft Homebrew nicht. Kann nichts verwenden, was "curl site | sudo bash" benötigt
Mike DeSimone