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).
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:
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?
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ê pode obter essas informações pelo comando nproc(1)
$ nproc --all
12
Não requer privilégios de root.
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.
Para que a resposta não seja confusa, você precisa entender alguns conceitos simples de arquitetura de computadores:
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.
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.
O exemplo do OP:
CPU(s): 4
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
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.
[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
$ 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.
getconf _NPROCESSORS_ONLN
(o getconf faz parte do glibc)
Eu encontrei este caminho:
echo $(('cat /sys/devices/system/cpu/present | sed 's/0-//'' + 1))
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'.
A família de CPU é irrelevante aqui.
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.
Uma maneira simples de descobrir o número de CPUs é emitindo os comandos abaixo:
cat /proc/interrupts | egrep -i 'cpu'