Estou um pouco confuso sobre o número de CPUs que meu servidor possui.
Ele está sendo executado no Intel(R) Xeon(R) Gold 6242R CPU @ 3.10GHz
qual, de acordo com os documentos oficiais da Intel, contém 20 núcleos físicos.
O problema aqui é a saída do lscpu
comando (algumas linhas filtradas):
CPU(s): 80
On-line CPU(s) list: 0-79
Thread(s) per core: 2
Core(s) per socket: 20
Socket(s): 2
NUMA node(s): 2
Model name: Intel(R) Xeon(R) Gold 6242R CPU @ 3.10GHz
NUMA node0 CPU(s): 0-19,40-59
NUMA node1 CPU(s): 20-39,60-79
Pelo que entendi actual physical cores = CPU(s) / thread(s) per core
, mas depois recebo 40, o que é o dobro do que eu esperava.
Alguém pode me explicar o que está acontecendo aqui e o que exatamente CPU(s), thread(s) per core, core(s) per socket, socet(s)
significa?
Sockets
representa quantas CPUs físicas estão no sistema.Cores per socket
é quantos núcleos de CPU completos (incluindo lógica de carregamento/decodificação) existem por CPU física.Threads per core
é quantos threads podem ser agendados em um único núcleo (HyperThreading). Simplificando, o hardware na CPU que é usado antes da execução real do código é duplicado, permitindo que a CPU tenha várias tarefas diferentes prontas para execução. Ele permite que a CPU busque/decodifique instruções antes que elas atinjam o núcleo de execução da CPU. Previne ou reduz a paralisação da tubulação .CPU
significa "entidades escalonáveis", isso é quantas filas de execução o sistema operacional terá, de modo que seriasockets x cores per socket x threads per core
No seu caso, você tem 2 CPUs físicas, cada uma com 20 núcleos, cada uma podendo executar 2 threads (hyperthreading). Então
2x20x2 = 80
, que é o número deCPUs
exibido.A confusão vem de um detalhe muito simples que pode não estar claro no
lscpu
comando info que está mostrando.A questão é: seu servidor realmente tem 2
Intel(R) Xeon(R) Gold 6242R CPU
s, que é mencionado naSocket(s)
linha.Como afirma a documentação da Intel, cada uma dessas CPUs contém 20 núcleos físicos (a
Core(s) per socket
linha), o que dá um total de 40 núcleos físicos.Cada um desses núcleos é capaz de executar 2 threads "simultaneamente" (a
Thread(s) per core
linha).Então: 2 Intel Xeon, 20 núcleos físicos cada um, 2 threads cada núcleo, dá um total de 80 "unidades que podem executar um processo" ou "CPUs"
A idéia de uma CPU é um pouco abstrata agora, e isso começou com o hyperthreading (final dos anos 90) e depois a série Intel Core (início dos anos 00). Antes disso, você definitivamente tinha sistemas com várias CPUs, mas eram todas com várias CPUs físicas.
Mas com hyperthreading e CPUs únicas de múltiplos núcleos, o número físico de CPUs é diferente do número lógico de CPUs que o código em execução nas CPUs vê.
Você tem 2 CPUs físicas como em "coisa com dissipador de calor conectado à sua placa-mãe"
Cada CPU física possui 20 núcleos, que parecem e funcionam principalmente como CPUs independentes para Linux. Os núcleos compartilham pelo menos o mesmo cache L3, provavelmente o cache L2, e provavelmente têm seu próprio cache L1 - portanto, não tão eficientes quanto os soquetes individuais com seu próprio L3/L2/L1, mas quase lá.
Como esse é cada soquete, você tem 2 * 20 = 40.
Cada núcleo tem 2 threads SMT, que são implementados pela microarquitetura da sua CPU para basicamente se parecer principalmente com CPUs independentes para Linux
Eles não serão tão rápidos quanto os núcleos independentes reais.
Threads na microarquitetura tentam pegar estágios de pipeline atualmente não utilizados dos núcleos, mas podem ter que acabar esperando se estiverem ocupados - e as CPUs já tentam se manter muito ocupadas, então, novamente, 2 threads em 2 núcleos não são nem de longe equivalentes a 4 núcleos, mas é algo que pode fazer o código rodar um pouco mais rápido.
Observe que o Spectre e vulnerabilidades semelhantes são muito mais possíveis em threads do que em núcleos ou soquetes porque os recursos principais são compartilhados.
De qualquer forma, como é por núcleo e também por soquete, são 2 * 20 * 2, o que fornece:
CPU dupla… processadores x2, 20 núcleos por soquete… x2 = 40 núcleos = 80 com HT.
Isso é provavelmente muito fácil de verificar simplesmente tirando a tampa/lado.
Seu servidor está usando 2 "Processor-Chips" (nos 2 Sockets), que possuem 20 núcleos físicos cada.
E cada núcleo pode processar 2 threads.
É por isso que ele exibe 2 (processador-chips) * 20 (núcleos por peça) * 2 (threads que cada núcleo pode processar) = 80 CPUs
Neste caso, CPU significa "entidade programável", também conhecido como. a quantidade de threads, que podem ser executados pela máquina.
Você tem 2 soquetes preenchidos com um processador cada, 20 núcleos por processador e 2 threads por núcleo.
2 x 20 x 2 = 80 CPUs
Eu acho que 80 CPUs é um nome impróprio e simplesmente um subproduto da história, porque no passado existiam apenas processadores single-core/thread, então processador, CPU, núcleo e thread eram usados de forma intercambiável.