Comment découvrir le nombre de cœurs * logiques * sur Mac OS X?

382

Comment pouvez-vous déterminer, à partir de la ligne de commande, combien de cœurs se trouvent sur la machine lorsque vous exécutez Mac OS X? Sous Linux, j'utilise:

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

Ce n'est pas parfait, mais c'est proche. Ceci est destiné à être alimenté make, c'est pourquoi il donne un résultat 1 supérieur au nombre réel. Et je sais que le code ci-dessus peut être écrit plus dense en Perl ou peut être écrit en utilisant grep, wc et cut, mais j'ai décidé que ce qui précède était un bon compromis entre concision et lisibilité.

MODIFICATION TRÈS TARD: Juste pour clarifier: je demande combien de cœurs logiques sont disponibles, car cela correspond au nombre de travaux simultanés que je veux makegénérer. La réponse de jkp, affinée par Chris Lloyd, était exactement ce dont j'avais besoin. YMMV.

Mike DeSimone
la source
Pour linux, j'évite d'avoir à en ajouter un en utilisant:grep ^processor /proc/cpuinfo | wc -l
courtlandj
3
Voir stackoverflow.com/questions/6481005/… Notez la nproccommande.
Mike DeSimone
désolé s'il s'agit d'une question noob mais quand vous parlez de cœurs logiques, vous parlez de cœurs physiques? En quoi les termes sont-ils différents (ou non)? Juste pour comprendre ce que vous demandez de mieux.
Charlie Parker
Non, je ne parle pas de noyaux physiques. Un noyau physique est un groupe de transistors sur une puce qui implémente un noyau. Un noyau logique est quelque chose qui semble être un noyau du système d'exploitation et des programmes utilisateur. Dans le grand nombre de cas, ce sont les mêmes. Cependant, la technologie Hyperthreading d'Intel (et peut-être d'autres) fait apparaître chaque cœur physique comme deux cœurs logiques.
Mike DeSimone

Réponses:

798

Vous pouvez le faire en utilisant l' utilitaire sysctl :

sysctl -n hw.ncpu
jkp
la source
6
Sur un MacBook Air de 1,7 GHz à la mi-2011, cette commande indique 4. Cependant, je soupçonne qu'il n'a vraiment que 2 cœurs, et system_profiler SPHardwareDataType semble d'accord. Pouvez-vous expliquer l'écart?
Joshua Flanagan
13
@JoshuaFlanagan combien de cœurs physiques la machine a-t-elle et de quelle puce s'agit-il? Si c'est un core i7 avec 2 cœurs physiques par exemple, il s'affichera comme 4 car la puce prend en charge l'hyper-threading et se présente à l'OS comme si elle avait 4 cœurs adressables.
jkp
142
Si vous vous souciez vraiment, essayez sysctl hw.physicalcpuou sysctl hw.logicalcpu, et en général sysctl hwpour toutes les options.
Codeur à longueur variable,
23
Rédacteurs: Veuillez ne pas modifier la réponse des années après l'avoir acceptée.
Mike DeSimone
2
Ne fonctionne pas sur Mac début 2015 exécutant El Capitan. J'obtiens "erreur:" hw.ncpu "est une clé inconnue". Il n'y a pas non plus d'entrée liée au processeur dans /etc/sysctl.conf. La réponse de Frozen Flame a fonctionné.
TheGT
130

Encore plus simple:

sysctl -n hw.ncpu
mlbright
la source
2
Le nombre signalé par ceci est en fait le double du nombre de cœurs si votre processeur prend en charge l'hyper-threading.
mikeazo
3
cela me donne 4, mais quand j'utilise system_profiler SPHardwareDataTypece que je peux croire `Identifiant du modèle: MacBookPro9,2 Nom du processeur: Intel Core i5 Vitesse du processeur: 2,5 GHz Nombre de processeurs: 1 Nombre total de
cœurs
31

Cela devrait être multiplateforme. Au moins pour Linux et Mac OS X.

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

Un peu lent mais ça marche.

Flamme gelée
la source
18

Pour ce faire en C, vous pouvez utiliser la famille de fonctions 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);

Les valeurs intéressantes à utiliser à la place de "hw.logicalcpu", qui compte les cœurs, sont:

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
la source
Mike, merci pour l'édition, ne se rendait pas compte que oldplen était un paramètre d'entrée-sortie.
Alfwatt
14

system_profiler SPHardwareDataType montre que j'ai 1 processeur et 4 cœurs.

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

[~] 

Cependant, sysctl n'est pas d'accord:

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

Mais sysctl semble correct, car lorsque j'exécute un programme qui devrait occuper tous les emplacements CPU, je vois que ce programme prend près de 800% du temps CPU (in top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
user1706991
la source
3
Vous voyez Hyperthreading au travail. Cela permet à chaque cœur de gérer deux threads d'exécution (pas nécessairement les mêmes que les threads du système d'exploitation, tels que pthreads). Par conséquent, MacOS traite chaque cœur physique comme deux cœurs logiques.
Mike DeSimone
Bonjour @MikeDeSimone pouvez-vous me montrer comment vérifier si l'hyper threading fonctionne en cas de CentOS?
Ciasto piekarz
@Ciastopiekarz Je suis assez certain que l'hyper threading est une caractéristique de l'architecture du processeur (Intel) plutôt que quelque chose que le système d'exploitation fait, je pense que le but est de faire croire au système d'exploitation qu'il a un cpu physique: sx 2 cœurs logiques sans avoir à faire quoi que ce soit spécial pour y accéder. Donc, si votre CPU est un Intel (tous les Mac sont livrés avec Intel), alors oui, vous avez un hyper threading. Si, toutefois, vous exécutez CentOS sur un PC, vous pouvez avoir un processeur AMD. Ils n'ont pas d'hyper threading mais comme ils viennent généralement avec deux fois plus de cœurs au même prix (ou moins), je ne suis pas sûr qu'il y ait une différence pratique.
Erk
@Erk Le système d'exploitation connaît la différence, en fait, il connaît la différence entre les processeurs et les cœurs ainsi que plusieurs threads s'exécutant sur un physique. sysctl hw.physicalcpumontrera combien de cœurs de processeur physiques sont à votre disposition, sysctl hw.logicalcpumontrera combien de cpus logiques à votre disposition. Les systèmes d'exploitation comme Windows / OSX / Linux font tout leur travail pour donner l'impression que vous avez plusieurs processeurs (quel que soit leur type). Les OS comme linux vous permettent de configurer quels processeurs, cœurs, threads peuvent être utilisés.
Rahly
10
$ system_profiler | grep 'Total Number Of Cores'
Kent
la source
2
plus rapide: $ system_profiler SPHardwareDataType | grep 'Total Number Of Cores'
kent
6
plus lent si vous incluez le temps de frappe
High Performance Mark
2
C'est dans un script bash; le temps de frappe n'est pas pertinent.
Mike DeSimone
3
il semble qu'Apple ait modifié le formatage de la sortie. Remarquez la capitalisation: auparavant, c'était «Nombre total de cœurs», c'est maintenant «Nombre total de cœurs» ... soit ça, soit je l'ai mal tapé précédemment ... désolé!
kent
3
vous pourriez utilisergrep -i
Skylar Saveland
8

Utilisez la system_profiler | grep "Cores"commande.

J'ai un:

MacBook Pro Retina, mi-2012.

Processeur: Intel Core i7 2,6 GHz

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

user$ sysctl -n hw.ncpu
8

Selon Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ), il n'y a pas de Core i7 avec 8 cœurs physiques, donc l' idée d' hyperthreading doit être le cas. Ignorez sysctlet utilisez la system_profilervaleur pour la précision. La vraie question est de savoir si vous pouvez exécuter efficacement des applications avec 4 cœurs (longs travaux de compilation?) Sans interrompre d'autres processus.

L'exécution d'un compilateur parallélisé avec 4 cœurs ne semble pas affecter considérablement les opérations régulières du système d'exploitation. Alors peut-être que le traiter comme 8 cœurs n'est pas si mal.

NetworkN8
la source
1
La génération d'un nombre de processus égal au nombre de cœurs logiques (deux fois le nombre de cœurs physiques dans le cas d'HyperThreading, comme vous le constatez) s'est plutôt bien déroulée pour moi.
Mike DeSimone
7

Comme l'a dit jkp dans un commentaire, cela ne montre pas le nombre réel de cœurs physiques. pour obtenir le nombre de cœurs physiques, vous pouvez utiliser la commande suivante:

system_profiler SPHardwareDataType
Tohid
la source
L'objectif était de déterminer le nombre de processus à générer make, de sorte que la réponse de jkp (nombre de cœurs logiques) convient le mieux.
Mike DeSimone,
3

La commande suivante vous donne toutes les informations sur votre CPU

$ sysctl -a | sort | grep cpu
asmaier
la source
Bien, mais pas ce qui a été demandé.
Mike DeSimone
1

CLARIFICATION

Lorsque cette question a été posée, le PO n'a pas dit qu'il voulait le nombre de cœurs LOGIQUES plutôt que le nombre réel de cœurs, donc cette réponse répond logiquement (sans jeu de mots) avec un moyen d'obtenir le réel nombre de cœurs physiques réels, non le nombre que l'OS essaie de virtualiser via le vaudou hyperthreading.

MISE À JOUR POUR GÉRER LE DÉFAUT DE YOSEMITE

En raison d'un bug étrange dans OS X Yosemite (et peut-être des versions plus récentes, telles que le prochain El Capitan), j'ai apporté une petite modification. (L'ancienne version fonctionnait toujours parfaitement bien si vous ignorez simplement STDERR, ce que toute la modification fait pour vous.)


Toutes les autres réponses données ici non plus

  1. donne des informations incorrectes
  2. ne donne aucune information, en raison d'une erreur dans l'implémentation de la commande
  3. fonctionne incroyablement lentement (en prenant la meilleure partie d'une minute pour terminer), ou
  4. donne trop de données, et pourrait donc être utile pour une utilisation interactive, mais est inutile si vous souhaitez utiliser les données par programme (par exemple, en tant qu'entrée dans une commande comme celle bundle install --jobs 3où vous souhaitez que le nombre à la place 3soit inférieur de un au nombre) de cœurs que vous avez, ou du moins pas plus que le nombre de cœurs)

La façon d'obtenir juste le nombre de cœurs, de manière fiable, correcte, raisonnablement rapide, et sans informations supplémentaires ni même de caractères supplémentaires autour de la réponse, est la suivante:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
iconoclaste
la source
3
Je viens de courir sysctl -n hw.ncpusur mon Mac Pro et je n'ai eu aucun de ces problèmes.
Mike DeSimone
Je n'ai évidemment pas testé sur tous les types de Mac, mais je vais vous croire que c'est parfois précis. Cependant, sysctlne donne pas de résultats précis sur ma machine, et d'autres ont signalé la même chose. S'il ne peut pas être invoqué pour toujours donner des résultats précis, il ne peut pas être considéré comme fiable et précis.
iconoclaste du
Vous pouvez également expliquer le comportement erroné que vous voyez et la ou les plates-formes sur sysctllesquelles vous le voyez, afin que les limites de son bon fonctionnement soient mieux connues, comme l'a fait user1706991.
Mike DeSimone
D'autres ont suggéré que cela était dû à l'hyper threading, donc le nombre que vous voyez avec sysctl est le nombre de cœurs que le système essaie de simuler, même s'il n'en a pas vraiment autant. Si vous voulez des chiffres précis, utilisez ma méthode. Si vous voulez savoir combien de cœurs l'ordinateur prétend avoir, utilisez sysctl.
iconoclaste du
@iconoclast en testant cela, j'ai trouvé que le «nombre total de cœurs» est localisé. Si OS X est défini sur autre chose que l'anglais, votre solution échoue. A fini par utiliser:sysctl -n hw.physicalcpu_max
CO
1

Sur un MacBook Pro exécutant Mavericks , sysctl -a | grep hw.cpune renverra que des détails cryptiques. Des informations beaucoup plus détaillées et accessibles sont révélées dans la machdep.cpusection, à savoir:

sysctl -a | grep machdep.cpu

En particulier, pour les processeurs avec HyperThreading(HT), vous verrez le nombre total d'UC énuméré ( logical_per_package) comme le double de celui du noyau physique ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
Karl Ehr
la source
Sur mon Mac Pro début 2008, cela me donne 4. Le nombre réel de cœurs est de 8, car il a deux puces CPU quad-core.
Mike DeSimone
sysctl machdep.cpu fonctionne également au lieu de lire toutes les autres informations inutiles.
hsn
1

Cela n'était pas spécifié dans la question d'origine (même si j'ai vu OP post dans les commentaires que ce n'était pas une option), mais de nombreux développeurs sur macOS ont installé le gestionnaire de paquets Homebrew.

Pour les futurs développeurs qui tombent sur cette question, tant que l'hypothèse (ou l'exigence) d'installation de Homebrew existe (par exemple, dans une organisation d'ingénierie dans une entreprise), nprocest l'un des binaires GNU courants inclus dans le coreutilspackage.

brew install coreutils

Si vous avez des scripts que vous préférez écrire une fois (pour Linux + macOS) au lieu de deux, ou pour éviter d'avoir des ifblocs où vous devez détecter le système d'exploitation pour savoir s'il faut ou non appeler nprocvs sysctl -n hw.logicalcpu, cela peut être une meilleure option.

Ryan Parman
la source
0

Commentaires pour 2 bonnes réponses ci-dessus:

1) concernant la réponse (et commentaires) acceptée par jkp: hw.ncpu est apparemment déconseillé au profit de hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) concernant la mise à jour 2014 de Karl Ehr: sur mon ordinateur (avec 2,5 GHz Intel Core i7), sysctl -a | grep machdep.cpu | grep per_packagerenvoie différents chiffres:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Les valeurs souhaitées sont:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Quel match:

hw.physicalcpu: 4

hw.logicalcpu: 8

marque
la source
0

Cela peut être fait de manière plus portable:

$ nproc --all
32

Compatible avec macOS et Linux.

Jay Taylor
la source
2
nprocne semble pas être disponible sur macOS Mojave.
Mike DeSimone
Merci de m'avoir prévenu, Mike. nprocest une installation triviale via homebrew.
Jay Taylor
Le système que j'utilisais était déconnecté d'Internet, donc homebrew n'aide pas. Impossible d'utiliser tout ce qui nécessite "curl site | sudo bash"
Mike DeSimone