Come scoprire il numero di core * logici * su Mac OS X?


382

Come puoi sapere, dalla riga di comando, quanti core sono sul computer quando esegui Mac OS X? Su Linux, utilizzo:

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

Non è perfetto, ma è vicino. Questo è destinato a essere alimentato make, motivo per cui dà un risultato 1 superiore al numero effettivo. E so che il codice sopra può essere scritto più densamente in Perl o può essere scritto usando grep, wc e cut, ma ho deciso che quanto sopra era un buon compromesso tra concisione e leggibilità.

MODIFICA MOLTO TARDA: solo per chiarire: sto chiedendo quanti core logici sono disponibili, perché questo corrisponde a quanti lavori simultanei voglio makespawnare. La risposta di jkp, ulteriormente perfezionata da Chris Lloyd, era esattamente ciò di cui avevo bisogno. YMMV.


Per Linux, evito di doverne aggiungere uno usando:grep ^processor /proc/cpuinfo | wc -l
courtlandj


scusa se questa è una domanda noob ma quando intendi core logici intendi core fisici? In che modo i termini sono diversi (o no)? Giusto per capire cosa stai chiedendo di meglio.
Charlie Parker,

No, non intendo core fisici. Un nucleo fisico è un gruppo di transistor su un chip che implementa un nucleo. Un core logico è qualcosa che sembra essere un core per il sistema operativo e i programmi utente. Nel vasto numero di casi, questi sono gli stessi. Tuttavia, la tecnologia Hyperthreading di Intel (e forse altre) fa apparire ogni core fisico come due core logici.
Mike DeSimone,

Risposte:


797

Puoi farlo usando l' utility sysctl :

sysctl -n hw.ncpu

6
Su un MacBook Air a 1,7 GHz della metà del 2011, questo comando dice 4. Tuttavia, sospettavo davvero che avesse solo 2 core e SPHardwareDataType di system_profiler sembra essere d'accordo. Puoi spiegare la discrepanza?
Joshua Flanagan,

13
@JoshuaFlanagan quanti core fisici ha la macchina e che chip è? Se è un core i7 con 2 core fisici, ad esempio, mostrerà 4 perché il chip supporta l'hyper-threading e si presenta al sistema operativo come se avesse 4 core indirizzabili.
jkp,

142
Se ti interessa davvero, prova sysctl hw.physicalcpuo sysctl hw.logicalcpu, e in generale, sysctl hwper tutte le opzioni.
Codificatore a lunghezza variabile

23
Redattori: non modificare la risposta anni dopo averla accettata.
Mike DeSimone,

2
Non funziona su Mac all'inizio del 2015 con El Capitan. Ottengo "errore:" hw.ncpu "è una chiave sconosciuta". Non esiste alcuna voce relativa alla CPU in /etc/sysctl.conf. La risposta di Frozen Flame ha funzionato.
TheGT

130

Ancora più semplice:

sysctl -n hw.ncpu

2
Il numero riportato da questo è in realtà il doppio del numero di core se il processore supporta l'hyper-threading.
Mikeazo,

3
questo mi dà 4, ma quando uso ciò system_profiler SPHardwareDataTypeche posso credere `Identificatore del modello: MacBookPro9,2 Nome del processore: Intel Core i5 Velocità del processore: 2,5 GHz Numero di processori: 1 Numero totale di core: 2`
Ciasto piekarz

31

Questo dovrebbe essere multipiattaforma. Almeno per Linux e Mac OS X.

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

Un po 'lento ma funziona.


18

Per fare questo in C puoi usare la famiglia di funzioni sysctl (3):

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

Valori interessanti da utilizzare al posto di "hw.logicalcpu", che conta i core, sono:

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.

Mike, grazie per la modifica, non si era reso conto che oldplen era un parametro in-out.
Alfwatt,

14

system_profiler SPHardwareDataType mostra che ho 1 processore e 4 core.

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

[~] 

Tuttavia, sysctl non è d'accordo:

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

Ma sysctl sembra corretto, come quando eseguo un programma che dovrebbe occupare tutti gli slot della CPU, vedo che questo programma impiega quasi l'800% del tempo della CPU (in top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  

3
Stai vedendo Hyperthreading al lavoro. Ciò consente a ciascun core di gestire due thread di esecuzione (non necessariamente uguali ai thread del sistema operativo, come pthreads). Di conseguenza, MacOS tratta ogni core fisico come due core logici.
Mike DeSimone,

Ciao @MikeDeSimone puoi mostrarmi come verificare se l'hyper-threading funziona nel caso di CentOS?
Ciasto piekarz,


@Ciastopiekarz Sono abbastanza sicuro che l'hyper threading sia una caratteristica dell'architettura della CPU (Intel) piuttosto che qualcosa che il sistema operativo fa, penso che il punto sia far pensare al sistema operativo che ha CPU fisica: core logici sx 2 senza dover fare nulla speciale per accedervi. Quindi, se la tua CPU è un Intel (tutti i Mac sono dotati di Intel), allora sì, hai hyper threading. Se, tuttavia, esegui CentOS su un PC, potresti avere un processore AMD. Non hanno hyper threading ma dal momento che di solito hanno il doppio del numero di core allo stesso prezzo (o inferiore) non sono sicuro che ci sia una differenza pratica.
Erk,

@Erk Il sistema operativo conosce la differenza, infatti, conosce la differenza tra CPU e core nonché più thread in esecuzione su un fisico. sysctl hw.physicalcpumostrerà quanti core CPU fisici sono disponibili per te, sysctl hw.logicalcpumostrerà quanti CPU logici disponibili. I sistemi operativi come Windows / OSX / Linux fanno tutto il possibile per far sembrare che tu abbia più CPU (indipendentemente dal tipo). I sistemi operativi come Linux consentono di configurare quali CPU, core, threading possono essere utilizzati.
Rahly,

10
$ system_profiler | grep 'Total Number Of Cores'

2
più veloce: $ system_profiler SPHardwareDataType | grep "Numero totale di core"
Kent,

6
più lento se si include il tempo di digitazione
High Performance Mark

2
È in uno script bash; il tempo di digitazione è irrilevante.
Mike DeSimone,

3
sembra che Apple abbia modificato la formattazione dell'output. Nota la maiuscola: in precedenza era "Numero totale di core" ora è "Numero totale di core" ... o quello o l'ho appena digitato in precedenza in precedenza ... mi dispiace!
Kent,

3
potresti usaregrep -i
Skylar Saveland il

8

Usa il system_profiler | grep "Cores"comando

Ho un:

MacBook Pro Retina, metà 2012.

Processore: Intel Core i7 a 2,6 GHz

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

user$ sysctl -n hw.ncpu
8

Secondo Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) non esiste un Core i7 con 8 core fisici, quindi l' idea di Hyperthreading deve essere il caso. Ignora sysctle usa il system_profilervalore per la precisione. La vera domanda è se è possibile eseguire in modo efficiente applicazioni con 4 core (processi di compilazione lunghi?) Senza interrompere altri processi.

L'esecuzione di un compilatore parallelizzato con 4 core non sembra influire in modo significativo sulle normali operazioni del sistema operativo. Quindi forse trattarlo come 8 core non è poi così male.


1
La generazione di un numero di processi pari al numero di core logici (il doppio del numero di core fisici nel caso di HyperThreading, come notate) ha funzionato abbastanza bene per me.
Mike DeSimone,

7

Come ha detto jkp in un commento, ciò non mostra il numero effettivo di core fisici. per ottenere il numero di core fisici è possibile utilizzare il seguente comando:

system_profiler SPHardwareDataType

L'obiettivo era determinare con quanti processi makespawnare, quindi la risposta di jkp (numero di core logici) si adattava meglio.
Mike DeSimone,

3

Il seguente comando fornisce tutte le informazioni sulla tua CPU

$ sysctl -a | sort | grep cpu

Bello, ma non quello che è stato chiesto.
Mike DeSimone,

1

UNA PRECISAZIONE

Quando è stata posta questa domanda, l'OP non ha detto che voleva il numero di core LOGICI piuttosto che il numero effettivo di core, quindi questa risposta logicamente (nessun gioco di parole previsto) risponde con un modo per ottenere il numero effettivo di core fisici reali, non il numero che il sistema operativo cerca di virtualizzare attraverso il voodoo hyperthreading.

AGGIORNAMENTO PER MANEGGIARE FLAW IN YOSEMITE

A causa di uno strano bug in OS X Yosemite (e forse versioni più recenti, come l'imminente El Capitan), ho apportato una piccola modifica. (La vecchia versione funzionava ancora perfettamente se ignori semplicemente STDERR, che è tutto ciò che la modifica fa per te.)


Ogni altra risposta data qui neanche

  1. fornisce informazioni errate
  2. non fornisce informazioni a causa di un errore nell'implementazione del comando
  3. funziona incredibilmente lentamente (completando la parte migliore di un minuto ), oppure
  4. fornisce troppi dati, e quindi potrebbe essere utile per l'uso interattivo, ma è inutile se si desidera utilizzare i dati a livello di codice (ad esempio, come input per un comando come bundle install --jobs 3dove si desidera che il numero al posto di 3essere uno in meno del numero di core che hai, o almeno non più del numero di core)

Il modo per ottenere solo il numero di core, in modo affidabile, corretto, ragionevolmente veloce e senza informazioni aggiuntive o persino caratteri extra attorno alla risposta, è questo:

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

3
Ho appena eseguito sysctl -n hw.ncpuil mio Mac Pro e non ho riscontrato nessuno di questi problemi.
Mike DeSimone,

Ovviamente non ho testato su tutti i tipi di Mac, ma ti credo che a volte sia accurato. Tuttavia, sysctlnon fornisce risultati accurati sulla mia macchina e altri hanno riportato la stessa cosa. Se non si può fare affidamento su di dare sempre risultati accurati, non può essere considerato affidabile e preciso.
iconoclasta

Potresti anche spiegare il comportamento errato che vedi e su quale piattaforma (e) la vedi, quindi i limiti del sysctlcorretto funzionamento sono meglio conosciuti, come ha fatto user1706991.
Mike DeSimone,

Altri hanno suggerito che ciò è dovuto all'hyper threading, quindi il numero che vedi con sysctl è il numero di core che il sistema sta cercando di simulare, anche se in realtà non ne ha molti. Se vuoi numeri precisi, usa il mio metodo. Se vuoi sapere quanti core il computer finge di avere, usa sysctl.
iconoclasta

@iconoclast nel test questo ho scoperto che il "Numero totale di core" è localizzato. Se OS X non è impostato su inglese, la soluzione non riesce. Finì con:sysctl -n hw.physicalcpu_max
CO

1

Su un MacBook Pro con Mavericks , sysctl -a | grep hw.cpuverranno restituiti solo alcuni dettagli criptici. Informazioni molto più dettagliate e accessibili sono rivelate nella machdep.cpusezione, ovvero:

sysctl -a | grep machdep.cpu

In particolare, per i processori con HyperThreading(HT), vedrai il conteggio totale enumerato della CPU ( logical_per_package) doppio rispetto al conteggio dei core fisici ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package

Sul mio Mac Pro di inizio 2008, questo mi dà 4. Il numero effettivo di core è 8, poiché ha due chip CPU quad-core.
Mike DeSimone,

sysctl machdep.cpu funziona anche invece di leggere tutte le altre informazioni non necessarie.
hsn

1

Non è stato specificato nella domanda originale (anche se ho visto OP post nei commenti che questa non era un'opzione), ma molti sviluppatori su macOS hanno installato il gestore di pacchetti Homebrew.

Per i futuri sviluppatori che si imbattono in questa domanda, purché sussista il presupposto (o il requisito) dell'installazione di Homebrew (ad esempio, in un'organizzazione ingegneristica in un'azienda), nprocè uno dei binari GNU comuni inclusi nel coreutilspacchetto.

brew install coreutils

Se hai script che preferiresti scrivere una volta (per Linux + macOS) anziché due volte, o per evitare di avere ifblocchi in cui è necessario rilevare il sistema operativo per sapere se chiamare o meno nprocvs sysctl -n hw.logicalcpu, questa potrebbe essere un'opzione migliore.


0

Commenti per 2 buone risposte sopra:

1) re la risposta accettata (e commenti) di jkp: hw.ncpu è apparentemente deprecato a favore di hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) in riferimento all'aggiornamento 2014 di Karl Ehr: sul mio computer (con 2,5 ghz Intel Core i7), sysctl -a | grep machdep.cpu | grep per_packagerestituisce numeri diversi:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

I valori desiderati sono:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Quale partita:

hw.physicalcpu: 4

hw.logicalcpu: 8


0

Questo può essere fatto in un modo più portatile:

$ nproc --all
32

Compatibile con macOS e Linux.


2
nprocnon sembra essere disponibile su macOS Mojave.
Mike DeSimone,

Grazie per avermelo fatto notare, Mike. nprocè una banale installazione tramite homebrew.
Jay Taylor,

Il sistema che stavo eseguendo era disconnesso da Internet, quindi homebrew non aiuta. Non riesco a usare tutto ciò che necessita di "curl site | sudo bash"
Mike DeSimone,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.