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 = Threads por núcleo X núcleos por soquete X soquetes
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:
$ 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 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):
$ 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 ao Core(s) per socket
reportado 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 é 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:
$ 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 lscpu
comando 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