Como descobrir o número de núcleos * lógicos * no Mac OS X?

382

Como você pode dizer, na linha de comando, quantos núcleos existem na máquina quando você está executando o Mac OS X? No Linux, eu uso:

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

Não é perfeito, mas está próximo. Isso se destina a alimentar make, e é por isso que ele fornece um resultado 1 maior que o número real. E eu sei que o código acima pode ser escrito mais densamente em Perl ou pode ser escrito usando grep, wc e cut, mas eu decidi que o acima foi uma boa troca entre concisão e legibilidade.

EDIÇÃO MUITO TARDE: Apenas para esclarecer: estou perguntando quantos núcleos lógicos estão disponíveis, porque isso corresponde a quantos trabalhos simultâneos eu quero makegerar. A resposta de jkp, mais refinada por Chris Lloyd, era exatamente o que eu precisava. YMMV.

Mike DeSimone
fonte
Para o linux, evito ter que adicionar um usando:grep ^processor /proc/cpuinfo | wc -l
courtlandj
3
Consulte stackoverflow.com/questions/6481005/… Observe o nproccomando.
Mike DeSimone
desculpe se esta é uma pergunta noob mas quando você quer dizer núcleos lógicos você quer dizer núcleos físicos? Como os termos são diferentes (ou não)? Só para entender o que você está pedindo melhor.
Charlie Parker
Não, não estou falando de núcleos físicos. Um núcleo físico é um grupo de transistores em um chip que implementa um núcleo. Um núcleo lógico é algo que parece ser o núcleo do sistema operacional e dos programas do usuário. No grande número de casos, esses são os mesmos. No entanto, a tecnologia Hyperthreading da Intel (e talvez outras) faz com que cada núcleo físico apareça como dois núcleos lógicos.
Mike DeSimone

Respostas:

797

Você pode fazer isso usando o utilitário sysctl :

sysctl -n hw.ncpu
jkp
fonte
6
Em um MacBook Air de 1.7GHz, em meados de 2011, este comando diz 4. No entanto, suspeitava que ele realmente tivesse apenas dois núcleos, e o system_profiler SPHardwareDataType parece concordar. Você pode explicar a discrepância?
Joshua Flanagan
13
@JoshuaFlanagan quantos núcleos físicos a máquina possui e qual chip é? Se for um Core i7 com 2 núcleos físicos, por exemplo, será exibido como 4 porque o chip suporta hyper-threading e se apresenta ao sistema operacional como se tivesse 4 núcleos endereçáveis.
Jkp 26/09
142
Se você realmente se importa, tente sysctl hw.physicalcpuou sysctl hw.logicalcpu, em geral, sysctl hwpara todas as opções.
Codificador de comprimento variável
23
Editores: por favor, não mude a resposta anos depois de a ter aceite.
Mike DeSimone
2
Não funciona no Mac do início de 2015 com o El Capitan. Eu recebo "error:" hw.ncpu "é uma chave desconhecida". Não há entrada relacionada à CPU no /etc/sysctl.conf também. A resposta de Frozen Flame funcionou.
TheGT
130

Ainda mais fácil:

sysctl -n hw.ncpu
mlbright
fonte
2
O número relatado por isso é na verdade o dobro do número de núcleos, se o seu processador suportar hyperthreading.
Mikeazo
3
isso me dá 4, mas quando eu uso o system_profiler SPHardwareDataTypeque posso acreditar `Identificador de modelo: MacBookPro9,2 Nome do processador: Intel Core i5 Velocidade do processador: 2,5 GHz Número de processadores: 1 Número total de núcleos:
2`
31

Isso deve ser multiplataforma. Pelo menos para Linux e Mac OS X.

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

Um pouco lento, mas funciona.

Chama Congelada
fonte
18

Para fazer isso em C, você pode usar a família de funções 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);

Valores interessantes para usar no lugar de "hw.logicalcpu", que conta núcleos, são:

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
fonte
Mike, obrigado pela edição, não percebeu que o oldplen era um parâmetro de entrada e saída.
alfwatt
14

system_profiler SPHardwareDataType mostra que eu tenho 1 processador e 4 núcleos.

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

[~] 

No entanto, o sysctl discorda:

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

Mas o sysctl parece correto, pois quando executo um programa que deve ocupar todos os slots da CPU, vejo esse programa levando cerca de 800% do tempo da CPU (pol top):

PID   COMMAND      %CPU  
4306  top          5.6   
4304  java         745.7 
4296  locationd    0.0  
user1706991
fonte
3
Você está vendo o Hyperthreading no trabalho. Isso permite que cada núcleo lide com dois threads de execução (não necessariamente o mesmo que os threads do SO, como pthreads). Como resultado, o MacOS trata cada núcleo físico como dois núcleos lógicos.
Mike DeSimone
Olá @MikeDeSimone, você pode me mostrar como verificar se o hyper threading está funcionando no caso do CentOS?
Ciasto piekarz
@Ciastopiekarz Estou bastante certo de que o hyper threading é um recurso da arquitetura da CPU (Intel), e não algo que o sistema operacional faz, acho que o ponto principal é fazer com que o sistema operacional pense que possui núcleos lógicos de CPU: sx 2 físicos sem ter que fazer nada especial para acessá-los. Portanto, se sua CPU é Intel (todos os Macs vêm com Intel), sim, você tem um hyper threading. Se, no entanto, você executar o CentOS em um PC, poderá ter um processador AMD. Eles não têm hyper threading, mas como geralmente vêm com o dobro de núcleos pelo mesmo preço (ou mais baixo), não tenho certeza se há uma diferença prática.
Erk
@ Erk O sistema operacional sabe a diferença; de fato, sabe a diferença entre CPUs e cores, bem como vários threads em execução em um físico. sysctl hw.physicalcpumostrará quantos núcleos físicos de CPU estão disponíveis para você, sysctl hw.logicalcpumostrará quantos cpus lógicos disponíveis para você. Sistemas operacionais como Windows / OSX / Linux fazem todo o trabalho para parecer que você tem várias CPUs (independentemente do tipo). Sistemas operacionais como o Linux permitem que você configure quais CPUs, núcleos e threads podem ser usados.
Rahly 23/09
10
$ system_profiler | grep 'Total Number Of Cores'
Kent
fonte
2
mais rápido: $ system_profiler SPHardwareDataType | grep 'Total número de núcleos'
kent
6
mais lento, se você incluir o tempo de digitação
High Performance Mark
2
Está em um script bash; o tempo de digitação é irrelevante.
23410 Mike DeSimone
3
parece que a Apple mudou a formatação da saída. Observe a capitalização: anteriormente era 'Número total de núcleos' agora é 'Número total de núcleos' ... ou isso ou simplesmente digitei errado anteriormente ... desculpe por isso!
Kent
3
você poderia usargrep -i
Skylar Saveland 1/13
8

Use o system_profiler | grep "Cores"comando

Eu tenho um:

MacBook Pro Retina, meados de 2012.

Processador: 2.6 GHz Intel Core i7

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

user$ sysctl -n hw.ncpu
8

De acordo com a Wikipedia, ( http://en.wikipedia.org/wiki/Intel_Core#Core_i7 ) não há Core i7 com 8 núcleos físicos, portanto, a ideia do Hyperthreading deve ser o caso. Ignore sysctle use o system_profilervalor para precisão. A verdadeira questão é se você pode ou não executar aplicativos eficientemente com 4 núcleos (trabalhos longos de compilação?) Sem interromper outros processos.

A execução de um compilador paralelamente a 4 núcleos não parece afetar drasticamente as operações regulares do SO. Então, talvez tratá-lo como 8 núcleos não seja tão ruim.

RedeN8
fonte
11
Gerar um número de processos igual ao número de núcleos lógicos (o dobro do número de núcleos físicos no caso do HyperThreading, como você observa) teve um desempenho muito bom para mim.
Mike DeSimone
7

Como o jkp disse em um comentário, isso não mostra o número real de núcleos físicos. para obter o número de núcleos físicos, você pode usar o seguinte comando:

system_profiler SPHardwareDataType
Esconder
fonte
O objetivo era determinar quantos processos gerar make, para que a resposta do jkp (número de núcleos lógicos) se encaixe melhor.
Mike DeSimone
3

O comando a seguir fornece todas as informações sobre sua CPU

$ sysctl -a | sort | grep cpu
asmaier
fonte
Bom, mas não o que foi perguntado.
Mike DeSimone
1

ESCLARECIMENTO

Quando essa pergunta foi feita a OP não disse que queria que o número de LOGICAL núcleos em vez do actual número de núcleos, então esta resposta logicamente (sem trocadilhos) respostas com uma forma de obter o real número de núcleos físicos reais, não o número que o sistema operacional tenta virtualizar através do vodu hyperthreading.

ATUALIZAÇÃO PARA LIDAR COM FLAW EM YOSEMITE

Devido a um bug estranho no OS X Yosemite (e possivelmente em versões mais recentes, como o próximo El Capitan), fiz uma pequena modificação. (A versão antiga ainda funcionou perfeitamente bem se você simplesmente ignorar o STDERR, que é toda a modificação que faz por você.)


Todas as outras respostas dadas aqui também

  1. fornece informações incorretas
  2. não fornece informações devido a um erro na implementação do comando
  3. corre incrivelmente devagar (demorando quase um minuto para concluir) ou
  4. fornece muitos dados e, portanto, pode ser útil para uso interativo, mas é inútil se você deseja usar os dados programaticamente (por exemplo, como entrada para um comando como bundle install --jobs 3onde você deseja que o número no lugar 3seja um a menos que o número de núcleos que você possui, ou pelo menos não mais do que o número de núcleos)

A maneira de obter apenas o número de núcleos, de maneira confiável, correta, razoavelmente rápida e sem informações adicionais ou mesmo caracteres extras em torno da resposta é:

system_profiler SPHardwareDataType 2> /dev/null | grep 'Total Number of Cores' | cut -d: -f2 | tr -d ' '
iconoclasta
fonte
3
Acabei de rodar sysctl -n hw.ncpuno meu Mac Pro e não tive nenhum desses problemas.
Mike DeSimone
Obviamente, não testei em todos os tipos de Macs, mas acredito que às vezes é preciso. No entanto, sysctlnão fornece resultados precisos na minha máquina e outros relataram a mesma coisa. Se não é possível confiar sempre em resultados precisos, não pode ser considerado confiável e preciso.
Iconoclast
Você também pode explicar o comportamento incorreto que vê e em que plataforma (s) você o vê, para que os limites de sysctl funcionamento adequado sejam mais conhecidos, como o user1706991.
Mike DeSimone 12/01
Outros sugeriram que isso se deve ao hiperencadeamento, portanto, o número que você vê com o sysctl é o número de núcleos que o sistema está tentando simular, mesmo que ele não tenha muitos. Se você quiser números precisos, use meu método. Se você quiser saber quantos núcleos o computador está fingindo ter, use o sysctl.
Iconoclast
@iconoclast ao testar isso, descobri que 'Número total de núcleos' está localizado. Se o OS X estiver definido como qualquer coisa, menos o inglês, sua solução falhará. Acabou usando:sysctl -n hw.physicalcpu_max
CO
1

Em um MacBook Pro executando o Mavericks , sysctl -a | grep hw.cpuretornará apenas alguns detalhes enigmáticos. Informações muito mais detalhadas e acessíveis são reveladas na machdep.cpuseção, ou seja:

sysctl -a | grep machdep.cpu

Em particular, para processadores com HyperThreading(HT), você verá a contagem total de CPU enumerada ( logical_per_package) como o dobro da contagem física de núcleos ( cores_per_package).

sysctl -a | grep machdep.cpu  | grep per_package
Karl Ehr
fonte
No meu Mac Pro do início de 2008, isso me dá 4. O número real de núcleos é 8, uma vez que possui dois chips de CPU quad-core.
Mike DeSimone
O sysctl machdep.cpu também funciona em vez de ler todas as outras informações desnecessárias.
Hsn
1

Não foi especificado na pergunta original (embora eu tenha visto OP postar nos comentários que isso não era uma opção), mas muitos desenvolvedores no macOS têm o gerenciador de pacotes Homebrew instalado.

Para futuros desenvolvedores que se deparam com essa questão, desde que exista a suposição (ou requisito) de Homebrew sendo instalado (por exemplo, em uma organização de engenharia de uma empresa), nprocé um dos binários comuns do GNU incluídos no coreutilspacote.

brew install coreutils

Se você possui scripts que prefere escrever uma vez (para Linux + macOS) em vez de duas vezes, ou para evitar ifbloqueios nos quais você precisa detectar o sistema operacional para saber se deve ou não chamar nprocvs sysctl -n hw.logicalcpu, essa pode ser uma opção melhor.

Ryan Parman
fonte
0

Comentários para 2 boas respostas acima:

1) re resposta aceita (e comentários) por jkp: hw.ncpu aparentemente está obsoleta em favor do hw.logicalcpu ( https://ghc.haskell.org/trac/ghc/ticket/8594 )

2) re a atualização de 2014 de Karl Ehr: no meu computador (com 2,5 ghz intel core i7), sysctl -a | grep machdep.cpu | grep per_packageretorna números diferentes:

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8

Os valores desejados são:

machdep.cpu.core_count: 4

machdep.cpu.thread_count: 8

Qual partida:

hw.physicalcpu: 4

hw.logicalcpu: 8

Marca
fonte
0

Isso pode ser feito de uma maneira mais portátil:

$ nproc --all
32

Compatível com macOS e Linux.

Jay Taylor
fonte
2
nprocparece não estar disponível no macOS Mojave.
Mike DeSimone
Obrigado por me informar, Mike. nprocé uma instalação trivial através do homebrew.
Jay Taylor
O sistema que eu estava executando estava desconectado da Internet, portanto o homebrew não ajuda. Não é possível usar qualquer coisa que precise de "curl site | sudo bash" #
Mike DeSimone