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

171

Eu queria descobrir quantos núcleos meu sistema tem, então pesquisei a mesma pergunta no Google. Eu tenho alguns comandos, como o comando lscpu . 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
  • Core (s) por soquete: 4
  • família de CPUs: 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?

    
por Mr ASquare 24.07.2015 / 08:57

12 respostas

94

Você tem que olhar para soquetes e núcleos por soquete. Neste caso você tem 1 CPU física (socket) que possui 4 núcleos (núcleos por socket).

    
por 24.07.2015 / 09:15
173

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

CPUs = Threads per core X cores per socket X sockets

As CPUs são o que você vê quando executa htop (estas 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 nproc corresponde à 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/cpuinfo deve corresponder a essa informação, por exemplo, no sistema de desktop acima, podemos ver que há 8 processadores (CPUs) e 4 núcleos (ID do 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 cores informado por /proc/cpuinfo corresponde ao Core(s) per socket informado por lscpu . Para a máquina de desktop acima, isso deve corresponder ao (s) 4 Core (os) por soquete relatado pelo lscpu:

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

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

Cores = Cores per socket X Sockets

Para o exemplo, os sistemas acima da área de trabalho possuem 4 núcleos:

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

Enquanto o servidor tem 16:

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

Outro utilitário útil é dmidecode , que gera informações por soquete. No caso do sistema do 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

Em resumo:

  • Você precisa estar ciente dos sockets, núcleos e threads
  • Você precisa ter cuidado com o termo CPU, pois significa coisas diferentes em diferentes contextos
por 27.04.2016 / 06:03
50

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

$ nproc --all
12

Não requer privilégios de root.

    
por 08.12.2015 / 09:42
12

Você também pode usar o comando cat /proc/cpuinfo , que produzirá uma parte dos dados para cada núcleo. Cada pedaço 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 a última parte diz processor : 3 , como neste caso, sua máquina tem 4 núcleos.

    
por 24.07.2015 / 09:45
12

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

  • Você executa processos ("programs") no seu sistema linux. Cada processo consiste em um ou mais threads
  • Cada thread é uma seqüência separada de instruções . Dois segmentos podem ser executados em paralelo.
  • Cada instrução é dada a uma CPU a ser executada. Uma CPU tem lógica que descobre o que significam os 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 despacha as diferentes instruções para diferentes unidades de hardware . Por exemplo, instruções aritméticas são realmente realizadas 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 . / p>

  • Um core refere-se a um conjunto de hardware de execução real (por exemplo, cada 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 ideia: o thread A está atualmente fazendo aritmética, enquanto o thread B está carregando algo da memória. Quando isso é verdade, os segmentos A e B podem compartilhar eficientemente um único núcleo sem entrar no caminho um do outro (A usa a ALU, B usa a unidade de memória). É claro que, às vezes, ambos os programas querem a ULA, e então eles têm que esperar um pelo outro ...
  • Um socket é o slot físico na placa-mãe no qual um chip é inserido. Este chip tem um certo número de núcleos nele.

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)
  • Apenas 1 thread pode emitir instruções para um núcleo (sem hyperthreading), o que significa que existe
  • 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 começam a emitir instruções para cada núcleo (esta máquina possui hyperthreading), o que significa que deve haver duas CPUs conectadas a cada núcleo, totalizando 8 * 2 = 16 CPUs

A primeira máquina pode executar 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á alcançado somente quando cada par de CPUs estiver executando diferentes tipos de instruções e, assim, puder compartilhar um núcleo sem esperar.

    
por 15.03.2017 / 23:35
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
    
por 19.02.2016 / 18:58
3
$ grep -c processor /proc/cpuinfo
8

Isso é tudo que você precisa. É o número de núcleos on-line, independentemente de o hyperthreading estar ativado ou desativado.

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

Outra maneira fácil.

    
por 29.10.2016 / 23:50
3
getconf _NPROCESSORS_ONLN

(o getconf faz parte do glibc)

    
por 18.12.2016 / 20:21
0

Eu encontrei este caminho:

echo $(('cat /sys/devices/system/cpu/present | sed 's/0-//'' + 1))
    
por 14.12.2016 / 13:42
0

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

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

    
por 05.01.2017 / 05:51
-2

A família de CPU é irrelevante aqui.

  • CPU (s) = soquetes físicos
  • Core (s) por soquete - como diz
  • so número total de núcleos = CPU (s) * Core (s) por soquete

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.

    
por 24.07.2015 / 09:05
-2

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

cat /proc/interrupts | egrep -i 'cpu'
    
por 23.03.2017 / 10:58

Tags