Como saber o número de núcleos de um sistema no Linux?

231

Queria descobrir quantos núcleos meu sistema possui; pesquisei a mesma pergunta no Google. Eu tenho alguns comandos, como o lscpucomando Quando tentei esse comando, ele me deu o seguinte resultado:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 23
Stepping:              10
CPU MHz:               1998.000
BogoMIPS:              5302.48
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              2048K
NUMA node0 CPU(s):     0-3

Em particular, esta saída mostra:

  • CPU (s): 4
  • Núcleo (s) por soquete: 4
  • Família de CPU: 6

Qual desses indica núcleos de um sistema Linux?

Existe algum outro comando para informar o número de núcleos ou estou assumindo que está completamente errado?

Mr ASquare
fonte
1
meu comando simples para todos os usuários: $ grep precessor / proc / cpuinfo | wc -l
สมหวัง แนวหน้า
6
Sua imagem de texto não é muito útil . Ele não pode ser copiado para um editor e não é indexado muito bem, o que significa que outros usuários com o mesmo problema têm menos probabilidade de encontrar a resposta aqui. Por favor edite seu post para incorporar o texto relevante diretamente (de preferência usando cópia + colar para evitar erros de transcrição).
perfil completo de Toby Speight

Respostas:

117

Você deve procurar soquetes e núcleos por soquete. Nesse caso, você tem 1 CPU física (soquete) que possui 4 núcleos (núcleos por soquete).

user1403360
fonte
1
Eu tenho um soquete, dois cpus por soquete, o que significaria um total de 2. No entanto, ele diz 4 cpus. Se eu tentar nproc, recebo 4 de volta. Usando cat /proc/cpuinfoeu recebo 4, e, portanto, parece que esta resposta está errada, pelo menos para a minha situação.
SPRBRN
14
Não se você tiver hiper threading. Você ainda tem 2 núcleos físicos, mas cada núcleo é exibido em / proc / cpuinfo duas vezes. Se você olhar cuidadosamente sob o coreid, poderá ver que cada coreid está listado duas vezes. Também sob bandeiras, você pode ver a bandeira ht.
User1403360
237

Para obter uma imagem completa, é necessário analisar o número de threads por núcleo, núcleos por soquete e soquetes . Se você multiplicar esses números, obterá o número de CPUs no seu sistema.

CPUs = Threads por núcleo X núcleos por soquete X soquetes

CPUs são o que você vê quando executa htop(elas não equivalem a CPUs físicas).

Aqui está um exemplo de uma máquina desktop:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1

E um servidor:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2

A saída de nproccorresponde à contagem de CPU de lscpu. Para a máquina de desktop acima, isso deve corresponder às 8 CPUs relatadas por lscpu:

$ nproc --all
8

A saída de /proc/cpuinfodeve corresponder a essas informações; por exemplo, no sistema de desktop acima, podemos ver que existem 8 processadores (CPUs) e 4 núcleos (identificação de núcleo 0-3):

$ grep -E 'processor|core id' /proc/cpuinfo
processor   : 0
core id     : 0
processor   : 1
core id     : 0
processor   : 2
core id     : 1
processor   : 3
core id     : 1
processor   : 4
core id     : 2
processor   : 5
core id     : 2
processor   : 6
core id     : 3
processor   : 7
core id     : 3

O cpu coresreportado por /proc/cpuinfocorresponde ao Core(s) per socketreportado por lscpu. Para a máquina de desktop acima, isso deve corresponder aos 4 núcleos por soquete relatados pelo lscpu:

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

Para responder especificamente à sua pergunta, diga quantos núcleos você possui, multiplicando o número de núcleos que você possui por soquete pelo número de soquetes que você possui.

Núcleos = Núcleos por soquete X Soquetes

Para os sistemas de exemplo acima, a área de trabalho possui 4 núcleos:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4

Enquanto o servidor tiver 16:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16

Outro utilitário útil é o dmidecodeque gera informações por soquete. No caso do sistema de servidor listado acima, esperamos ver 8 núcleos por soquete e 16 threads por soquete:

$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
    Socket Designation: CPU1
    Core Count: 8
    Thread Count: 16
    Socket Designation: CPU2
    Core Count: 8
    Thread Count: 16

O lscpucomando possui várias opções úteis que você pode conferir, por exemplo:

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

Veja man lscpupara detalhes.

Em suma:

  • Você precisa estar ciente de soquetes, núcleos e threads
  • Você precisa ter cuidado com o termo CPU, pois significa coisas diferentes em contextos diferentes
htaccess
fonte
12
Esta deve ser a resposta aceita
gansub
2
Concordo. Essa deve ser a resposta aceita, pois explica melhor o assunto.
Rafael
Eu acho que adicionar lscpu --all --extendedseria uma adição útil, mas não tenho mais acesso a essas máquinas em particular.
htaccess
Você também pode evitar o awk e uma multiplicação explícita:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský
@Jakub Klinkovský, obrigado por apontar isso, mas neste caso eu quero realmente demonstrar a multiplicação de Socket(s) * Core(s) per socket. Dado o que acabei de dizer, acho echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))que seria melhor para que as pessoas pudessem ver exatamente o que está sendo multiplicado ...
htaccess
62

Você pode obter essas informações por nproc(1)comando

$ nproc --all
12

Não requer privilégios de root.

Anthony Ananich
fonte
10
Isso está incorreto, a saída do nproc corresponde à contagem de CPU do lscpu. Se você tiver núcleos multithread, a saída do nproc não corresponderá ao número de núcleos que você possui.
Htaccess
2
Para uma solução não raiz, um hack seria usar top e hit 1. Isso mostrará o número de núcleos disponíveis . O motivo pelo qual vi "disponível" é porque o hardware subjacente pode ter mais núcleos, como uma infraestrutura de nuvem.
Hopping Bunny
@htaccess Pelo menos no Ubuntu, isso gera o número correto de CPUs lógicas on-line
Wil
1
@ htaccess ok eu entendi. Normalmente, quando um linux duffer pergunta quantos núcleos eles significam quantos threads lógicos estão disponíveis. Tecnicamente falando, o linux está errado ao chamar os threads de hardware de 'cpus'. Sua máquina possui 1 CPU com 2 núcleos e 4 threads de hardware SMT. Há uma enorme quantidade de ambiguidade no que as CPUs e os núcleos significam como resultado. Mas entendi o que você quis dizer agora, ty.
Wil
1
@ Sim, eu chamo isso na minha resposta acima: "Você precisa ter cuidado com o termo CPU, pois significa coisas diferentes em contextos diferentes". Pessoalmente, não comparo "núcleos" a unidades de processamento lógico, mas a núcleos físicos no processador (ou seja, as unidades de processamento físico).
htaccess
19

Para que a resposta não seja confusa, você precisa entender alguns conceitos simples de arquitetura de computador:

  • Você executa processos ("programas") no seu sistema Linux. Cada processo consiste em um ou mais encadeamentos
  • Cada thread é uma sequência separada de instruções . Dois threads podem ser executados em paralelo.
  • Cada instrução é dada a uma CPU a ser executada. Uma CPU possui uma lógica que descobre o significado dos bits de uma instrução e decide o que fazer com ela.
  • Existem diferentes tipos de instruções. A lógica de decisão dentro de uma CPU enviará as diferentes instruções para diferentes unidades de hardware . Por exemplo, instruções aritméticas são realmente executadas por uma ALU (unidade aritmética / lógica), enquanto instruções que carregam / armazenam da memória são executadas por algum tipo de unidade de memória .

  • Um núcleo refere-se a um conjunto de hardware de execução real (ou seja, todo núcleo tem uma ALU, uma unidade de memória, etc ...)

  • Você pode ter várias CPUs que compartilham um núcleo - isso é chamado de hyperthreading.

    • A idéia: o thread A está atualmente fazendo aritmética, enquanto o thread B está carregando algo da memória. Quando isso é verdade, os encadeamentos A e B podem compartilhar com eficiência um único núcleo sem interferir um no outro (A usa a ALU, B usa a unidade de memória). É claro que, às vezes, os dois programas desejam a ULA e precisam esperar um pelo outro ...
  • Um soquete é o slot físico na placa-mãe no qual um chip é inserido. Este chip possui um certo número de núcleos.

Exemplos:

O exemplo do OP:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • um soquete físico, que contém um chip com
  • 4 núcleos físicos (pense em 4 ALUs e 4 unidades de memória no total)
  • Somente um thread pode emitir instruções para um núcleo (sem hyperthreading), o que significa que há
  • uma CPU por núcleo ou 4 * 1 = 4 CPUs

Outro exemplo:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

Dois soquetes físicos, cada um contendo um chip com 4 núcleos físicos, totalizando 8 núcleos. Dois threads emitem instruções para cada núcleo (esta máquina possui hyperthreading), o que significa que deve haver duas CPUs conectadas a cada núcleo, perfazendo um total de 8 * 2 = 16 CPUs

A primeira máquina pode estar executando precisamente quatro instruções a qualquer momento, período. A segunda máquina pode executar entre 8 e 16 instruções a qualquer momento: 16 serão alcançadas somente quando cada par de CPUs estiver executando tipos diferentes de instruções e, portanto, poderão compartilhar um núcleo sem esperar.

estocástico
fonte
14

Você também pode usar o comando cat /proc/cpuinfoque produzirá uma porção de dados para cada núcleo. Cada parte começa com esta informação:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)

Os núcleos são numerados a partir de 0; portanto, se o último bloco indicar processor : 3como neste caso, sua máquina terá 4 núcleos.

dr01
fonte
Graças a este comando, descrevendo as informações em detalhes. :)
Mr ASquare
Para um comando de uma linha, que você pode usargrep -c ^processor /proc/cpuinfo
Wildcard
5
getconf _NPROCESSORS_ONLN

(getconf faz parte da glibc)

LR
fonte
1
Isso é um pouco diferente (e útil para algumas necessidades). É o número de processadores que estão online agora (ou seja, disponíveis para processos em execução). Pode ser menor que o número total de CPUs, se uma ou mais foram colocadas offline (por exemplo, durante a hibernação ou ao adicionar / remover processadores).
precisa
E getconf _NPROCESSORS_CONFfornece o número de processadores configurados. Você também pode obter o valor dessas duas macros dentro de um código-fonte C, usando a sysconf()função Digite man sysconfpara obter mais informações.
Galaxy
4
[root@xxxxx ~]#  dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
    Socket Designation: CPU1
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
    Socket Designation: CPU2
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
reli
fonte
O que t 4faz com o dmidecode? Como as contagens e linhas ativadas se multiplicam? Seu exemplo mostra 2 núcleos, 6 ou 12 ou 24, ou algum outro número?
Xen2050 28/03
@ Xen2050 4é processor, consulte linux.die.net/man/8/dmidecode . Mas usar 4como argumento é uma má prática.
JohnKoch 10/07
bash: dmidecode: command not found
Cameron Hudson
3
$ grep -c processor /proc/cpuinfo
8

É tudo o que você precisa. É o número de núcleos online, independentemente de o hyperthreading estar ativado ou desativado.

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

Outra maneira fácil.

jwc
fonte
2
Isso é simples, mas não tenho certeza se é preciso para a pergunta. Ele pediu o número de núcleos: (núcleos! = Cpus) se o hyperthreading estiver ativado. Meu sistema possui 24 núcleos: 48 cpus quando hiperencadeado. Além disso, o uso do segundo comando fornecido ls -d /sys/devices/system/cpu/cpu* | wc -lmostrou 49 porque existe um diretório cpuidleentre os cpuNdiretórios.
Andrew Falanga
0

Eu encontrei assim:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
Serge Roussak
fonte
0

Só quero adicionar algumas informações à resposta do @htaccess.

No CentOS 6.x, o dmidecode não gera informações de contagem de núcleos / threads e, na verdade, considera 'CPU' como 'CPU' ou 'Core' em lscpu, não 'socket'.

PickBoy
fonte
Se essa não for a resposta, adicione-a como comentário.
Mongrel
@Mongrel que eu queria adicionar como comentário, mas comentar requer 50 reputação
PickBoy 6/17/17
-2

A família de CPU é irrelevante aqui.

  • CPU (s) = soquetes físicos
  • Núcleo (s) por soquete - como diz
  • assim o número total de núcleos = CPU (s) * núcleo (s) por tomada

No seu caso, você tem um total de 4 núcleos completos.

O que também pode ser importante, é "Thread (s) por núcleo". Mas você tem 1, então não no seu caso.

Tomasz Klim
fonte
1
Você está confundindo CPU (s) com Soquete (s) em sua descrição.
Jlliagre
1
Como jlliagre diz que isso está incorreto. Cores = Cores per socket X Sockets, veja a descrição na minha resposta.
Htaccess
-3

Uma maneira simples de descobrir o número de CPUs é emitindo os comandos abaixo:

cat /proc/interrupts | egrep -i 'cpu'
Sousa Gaspar
fonte
1
Interrompe ou cpuinfo?
Jeff Schaller
E conte com a opção -c?
Jeff Schaller