desenv-web-rp.com

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

Queria descobrir quantos núcleos meu sistema possui; 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
  • 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?

254
Mr ASquare

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).

124
user1403360

Para obter uma imagem completa, é necessário examinar 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 sockets

CPUs são o que você vê quando executa htop (elas não são equivalentes 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 CPU (s) relatadas por lscpu:

$ nproc --all
8

A saída de /proc/cpuinfo Deve corresponder a essas informações; por exemplo, no sistema de desktop acima, podemos ver que existem 8 processadores (CPUs) e 4 núcleos (ID 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 cores Reportado por /proc/cpuinfo Corresponde à Core(s) per socket reportada 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 é dmidecode que 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 comando lscpu 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 lscpu Para 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
251
htaccess

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

$ nproc --all
12

Não requer privilégios de root.

61
Anthony Ananich

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 threads
  • Cada thread é uma sequência separada de instruções. Dois threads podem ser executados em paralelo.
  • Cada instrução é dada a um CPU a ser executado. 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 instruções diferentes para diferentes nidades de hardware. Por exemplo, as instruções aritméticas são realmente executadas por um ALU (unidade aritmética/lógica), enquanto as instruções que carregam/armazenam da memória são executadas por algum tipo de - nidade 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 encadeamento 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.

23
stochastic

Você também pode usar o comando cat /proc/cpuinfo que 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 pedaço indicar processor : 3 como neste caso, sua máquina possui 4 núcleos.

14
dr01
getconf _NPROCESSORS_ONLN

(getconf faz parte da glibc)

7
L.R.
$ 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.

4
jwc
[[email protected] ~]#  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
4
reli

Eu encontrei assim:

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

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'.

0
PickBoy