2009-11-11 6 views
294

Wie können Sie anhand der Befehlszeile feststellen, wie viele Kerne sich auf dem Computer befinden, wenn Sie Mac OS X ausführen? Unter Linux verwende ich:Wie erkennt man die Anzahl * logischer * Kerne unter Mac OS X?

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

Es ist nicht perfekt, aber es ist nah. Dies soll make zugeführt werden, weshalb es ein Ergebnis 1 höher als die tatsächliche Zahl gibt. 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 das obige ein guter Kompromiss zwischen Prägnanz und Lesbarkeit war.

sehr spät EDIT: Nur um zu klären: Ich frage, wie viele logischen Kerne zur Verfügung stehen, da dies mit entspricht, wie viele Jobs gleichzeitig mag ich make zum Laichen. JKPs Antwort, weiter verfeinert von Chris Lloyd, war genau was ich brauchte. YMMV.

+0

für Linux, ich vermeiden, dass man hinzufügen, indem Sie mit: 'grep^Prozessor/proc/cpuinfo | wc -l – courtlandj

+2

Siehe http://stackoverflow.com/questions/6481005/obtain-the-number-of-cpus-cores-in-linux Beachten Sie den Befehl 'nproc'. –

+0

Entschuldigung, wenn das eine Frage ohne Frage ist, aber wenn Sie logische Kerne meinen, meinen Sie physische Kerne? Wie unterscheiden sich die Begriffe (oder nicht)? Nur um zu verstehen, was du besser verlangst. –

Antwort

609

Sie können dies die sysctl Dienstprogramm tun:

sysctl -n hw.ncpu

+5

Auf einem Mitte 2011 2011 MacBook Air 1,7 GHz, sagt dieser Befehl 4. Ich habe jedoch vermutet, dass es wirklich nur 2 Kerne hat, und system_profiler SPHardwareDataType scheint zuzustimmen. Kannst du die Diskrepanz erklären? –

+11

@JoshuaFlanagan Wie viele physische Kerne hat die Maschine und welcher Chip ist das? Wenn es sich zum Beispiel um einen Core i7 mit 2 physischen Kernen handelt, wird es als 4 angezeigt, da der Chip Hyper-Threading unterstützt und sich dem Betriebssystem so präsentiert, als hätte es 4 adressierbare Kerne. – jkp

+104

Wenn Sie wirklich interessiert, versuchen Sie 'sysctl hw.physicalcpu' oder' sysctl hw.logicalcpu', und im Allgemeinen 'sysctl hw' für alle Optionen. –

9
$ system_profiler | grep 'Total Number Of Cores' 
+2

schneller: $ system_profiler SPHardwareDataType | grep 'Gesamtanzahl der Kerne' – kent

+3

langsamer, wenn Sie Zeit eingeben –

+2

Es ist in einem Bash-Skript; Tippzeit ist irrelevant. –

6

Wie JKP in einem Kommentar sagte, die nicht die tatsächliche Anzahl der physischen Kerne nicht zeigen. die Anzahl der physischen Kerne erhalten Sie den folgenden Befehl verwenden:

system_profiler SPHardwareDataType 
+0

Das Ziel war es, zu bestimmen, wie viele Prozesse mit 'make' zu ​​spawnen sind, so dass die Antwort von jkp (Anzahl der logischen Kerne) am besten passt. –

116

Noch einfacher:

sysctl -n hw.ncpu 
+2

Die Zahl, die davon gemeldet wird, ist tatsächlich die doppelte Anzahl von Kernen, wenn Ihr Prozessor Hyper-threading unterstützt. – mikeazo

+2

das gibt mir 4, aber wenn ich 'system_profiler SPHardwareDataType' verwenden, die ich glauben kann,' Modell Identifikation: MacBookPro9,2 Prozessortyp: Intel Core i5 Prozessorgeschwindigkeit: 2,5 GHz Anzahl der Prozessoren: 1 Gesamtzahl der Kerne: 2' –

9

system_profiler SPHardwareDataType zeigt I 1 Prozessor und 4 Kerne haben.

[~] 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> 

[~]

jedoch Sysctl nicht einverstanden ist:

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

Aber Sysctl erscheint richtig, wie wenn ich ein Programm ausführen, die alle CPU-Slots in Anspruch nehmen sollen, ich dieses Programm sehe Nähe von 800% der CPU-Zeit (in oben) unter:

PID COMMAND% CPU
4306 top 5.6
4304 Java 745,7 4296 locationd 0,0

+2

Sie sehen Hyperthreading bei der Arbeit. Dadurch kann jeder Kern zwei Ausführungsthreads behandeln (nicht notwendigerweise die gleichen wie Betriebssystemthreads wie Pthreads). Infolgedessen behandelt MacOS jeden physischen Kern als zwei logische Kerne. –

+0

Hallo @MikeDeSimone können Sie mir zeigen, wie Sie überprüfen, ob Hyper Threading bei CentOS funktioniert? –

+1

http: // Stapelüberlauf.com/questions/2901694/programmatically-detect-Anzahl-von-physischen-Prozessoren-Kerne-oder-wenn-Hyper-Threading –

5

Verwenden system_profiler | grep "Cores" Befehl.

Ich habe ein:

MacBook Pro Retina, Mid 2012.

Processor: 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 keine Core i7 mit 8 physischem Kern, so dass die Hyperthreading Idee der Fall sein muss, . Ignorieren Sie sysctl und verwenden Sie den Wert system_profiler für die Genauigkeit. Die eigentliche Frage ist, ob Sie Anwendungen mit 4 Kernen (lange Compile-Jobs) effizient ausführen können, ohne andere Prozesse zu unterbrechen.

Das Ausführen eines Compilers, der mit 4 Kernen parallelisiert wird, scheint normale OS-Vorgänge nicht zu beeinträchtigen. Es ist also nicht so schlimm, es als 8 Kerne zu behandeln.

+0

Eine Reihe von Prozessen, die der Anzahl von * logischen * Kernen entsprechen (die doppelte Anzahl physikalischer Kerne im Fall von HyperThreading, wie Sie bemerken), hat sich für mich ziemlich gut entwickelt. –

0

KLARSTELLUNG

Wenn diese Frage der OP gefragt wurde, habe nicht gesagt, dass er die Zahl der LOGISCH Kerne statt der tatsächlichen Anzahl der Kerne, so dass diese Antwort logisch wollte (kein Wortspiel beabsichtigt) Antworten mit einem Weg, um die tatsächlichen Anzahl der realen physischen Kernen, nicht die Zahl, die das Betriebssystem versucht, durch Hyperthreading Voodoo zu virtualisieren.

UPDATE ZUM HAND FLAW IN YOSEMITE

Durch eine seltsame bug in OS X Yosemite (und möglicherweise neuere Versionen, wie die kommende El Capitan), habe ich eine kleine Änderung vorgenommen. (Die alte Version funktionierte immer noch sehr gut, wenn Sie STDERR einfach ignorieren, was alles die Modifikation für Sie ist.)


Jede andere Antwort hier gegeben entweder

  1. gibt falsche Informationen
  2. keine Information gibt, aufgrund eines Fehler in dem Befehl Implementierung
  3. läuft unglaublich langsam (unter dem besseren Teil der a Minute zu vervollständigen), oder
  4. gibt zu viele Daten und kann daher nützlich sein für die interaktive Nutzung, sondern ist die Verwendung weniger, wenn Sie die Daten programmgesteuert verwenden möchten (z. B. als Eingabe für einen Befehl wie bundle install --jobs 3, wenn die Zahl anstelle von 3 um eins kleiner sein soll als die Anzahl der Kerne, die Sie haben, oder mindestens nicht mehr als Anzahl der Kerne)

die Art und Weise nur die Anzahl der Kerne zu erhalten, zuverlässig, korrekt, angemessen schnell und ohne zusätzliche Informationen oder sogar zusätzliche Zeichen rund um die Antwort, ist dies:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' ' 
+3

Ich habe 'sysctl -n hw.ncpu' auf meinem Mac Pro ausgeführt und hatte * keine * dieser Probleme. –

+0

Ich habe offensichtlich nicht auf allen Arten von Macs getestet, aber ich glaube dir, dass es * manchmal * genau ist. "Sysctl" gibt jedoch keine genauen Ergebnisse auf meinem Computer, und andere haben dasselbe berichtet. Wenn es nicht möglich ist, * immer * genaue Ergebnisse zu liefern, kann es nicht als zuverlässig und genau angesehen werden. – iconoclast

+0

Sie könnten auch das fehlerhafte Verhalten, das Sie sehen, und die Plattform (n), auf der Sie es sehen, erklären, so dass die Grenzen der richtigen Operation von sysctl besser bekannt sind, wie es user1706991 tat. –

17

zu In C können Sie 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" zu verwenden, die 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. 
+0

Mike, danke für die Bearbeitung, habe nicht gemerkt, dass oldplen ein In-Out-Parameter war. – alfwatt

1

Auf einem MacBook Pro läuft Mavericks, sysctl -a | grep hw.cpu nur einige kryptische Details zurück. Viel detaillierte und leicht zugängliche Informationen werden im machdep.cpu Abschnitt offenbart, das heißt:

sysctl -a | grep machdep.cpu 

Insbesondere für Prozessoren mit HyperThreading (HT), werden Sie die gesamte aufgezählt CPU-Anzahl (logical_per_package) als doppelt so die sehen physikalische Kernzählung (cores_per_package).

sysctl -a | grep machdep.cpu | grep per_package 
+0

Auf meinem frühen 2008 Mac Pro, das gibt mir 4. Die tatsächliche Anzahl der Kerne ist 8, da es zwei Quad-Core-CPU-Chips hat. –

0

Kommentare zu 2 gute Antworten oben:

1) erneut die akzeptierte Antwort (und Kommentare) von JKP: hw.ncpu ist offenbar für hw.logicalcpu veraltet (https://ghc.haskell.org/trac/ghc/ticket/8594)

2) wieder die 2014-Update von Karl Ehr: auf meinem Computer (mit 2,5 GHz Intel Core i7), sysctl -a | grep machdep.cpu | grep per_package kehren verschiedene Zahlen:

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 match:

hw.physicalcpu: 4

hw.logicalcpu: 8

15

Diese Quer Plattform sein sollte. Zumindest für Linux und Mac OS X.

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

Ein bisschen langsam, aber funktioniert.

-1

Der folgende Befehl gibt Ihnen alle Informationen über Ihre CPU

$ sysctl -a | sort | grep cpu 
+0

Schön, aber nicht was gefragt wurde. –