Queria descobrir quantos núcleos meu sistema possui; pesquisei a mesma pergunta no Google. Eu tenho alguns comandos, como o lscpu
comando 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?
Respostas:
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).
fonte
nproc
, recebo 4 de volta. Usandocat /proc/cpuinfo
eu recebo 4, e, portanto, parece que esta resposta está errada, pelo menos para a minha situação.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 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:
E um servidor:
A saída de
nproc
corresponde à contagem de CPU delscpu
. Para a máquina de desktop acima, isso deve corresponder às 8 CPUs relatadas porlscpu
: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 (identificação de núcleo 0-3):O
cpu cores
reportado por/proc/cpuinfo
corresponde aoCore(s) per socket
reportado porlscpu
. Para a máquina de desktop acima, isso deve corresponder aos 4 núcleos por soquete relatados pelo lscpu: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.
Para os sistemas de exemplo acima, a área de trabalho possui 4 núcleos:
Enquanto o servidor tiver 16:
Outro utilitário útil é o
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:O
lscpu
comando possui várias opções úteis que você pode conferir, por exemplo:Veja
man lscpu
para detalhes.Em suma:
fonte
lscpu --all --extended
seria uma adição útil, mas não tenho mais acesso a essas máquinas em particular.lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Socket(s) * Core(s) per socket
. Dado o que acabei de dizer, achoecho 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 ...Você pode obter essas informações por
nproc(1)
comandoNão requer privilégios de root.
fonte
Para que a resposta não seja confusa, você precisa entender alguns conceitos simples de arquitetura de computador:
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.
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:
Outro exemplo:
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.
fonte
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:Os núcleos são numerados a partir de 0; portanto, se o último bloco indicar
processor : 3
como neste caso, sua máquina terá 4 núcleos.fonte
grep -c ^processor /proc/cpuinfo
(getconf faz parte da glibc)
fonte
getconf _NPROCESSORS_CONF
fornece o número de processadores configurados. Você também pode obter o valor dessas duas macros dentro de um código-fonte C, usando asysconf()
função Digiteman sysconf
para obter mais informações.fonte
t 4
faz 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?4
éprocessor
, consulte linux.die.net/man/8/dmidecode . Mas usar4
como argumento é uma má prática.bash: dmidecode: command not found
É tudo o que você precisa. É o número de núcleos online, independentemente de o hyperthreading estar ativado ou desativado.
Outra maneira fácil.
fonte
ls -d /sys/devices/system/cpu/cpu* | wc -l
mostrou 49 porque existe um diretóriocpuidle
entre oscpuN
diretórios.Eu encontrei assim:
fonte
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'.
fonte
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.
fonte
Cores = Cores per socket X Sockets
, veja a descrição na minha resposta.Uma maneira simples de descobrir o número de CPUs é emitindo os comandos abaixo:
fonte