Você não precisa cat, antes awk, de qualquer maneira: basta awk '<script>' /proc/cpuinfo, assim: awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo. E você entra sem "menos um".
Tomasz Gandor
Para responder à pergunta diretamente, canalize o tail -n 1que leva a última linha e a imprime.
Observe que ambos acabarão contando o dobro do número de núcleos que realmente existe se você estiver em um sistema com hyperthreading (por exemplo, P4 ou Core i7).
duskwuff -inactive-
24
@uskwuff: que é exatamente o que você deseja na maioria dos casos.
precisa
8
grep -c '^processor' /proc/cpuinfono zsh.
Steven Lu
40
cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1também retornará o número errado se os números da CPU forem baseados em 0.
Phazor
3
A primeira linha retorna 1 Núcleo menos que o existente. Melhor cat / proc / cpuinfo | awk '/ ^ processador / {print $ 3}' | wc -l
Mirko Ebert
650
O processamento do conteúdo /proc/cpuinfoé desnecessariamente barroco. Use o nproc, que faz parte do coreutils, para que ele esteja disponível na maioria das instalações do Linux.
O comando nprocimprime o número de unidades de processamento disponíveis para o processo atual, que pode ser menor que o número de processadores online.
Para encontrar o número de todos os núcleos / processadores instalados, use nproc --all
No meu ubuntu antigo (10.10), o nproc não está disponível. Deve ser uma adição nova.
bukzor
3
Infelizmente, nprocnão é uma parte da boot2docker
kgadek
269
A solução mais portátil que encontrei é o getconfcomando:
getconf _NPROCESSORS_ONLN
Isso funciona no Linux e no Mac OS X. Outro benefício disso em relação a outras abordagens é que o getconf existe há muito tempo. Algumas das máquinas Linux mais antigas nas quais tenho que fazer desenvolvimento não têm os comandos nprocou lscpudisponíveis, mas eles têm getconf.
Nota do editor: Embora o getconfutilitário seja obrigatório para POSIX , o específico _NPROCESSORS_ONLNe os _NPROCESSORS_CONFvalores não são. Dito isto, como afirmado, eles funcionam em plataformas Linux e no macOS; no FreeBSD / PC-BSD, você deve omitir o líder _.
Isso funcionou para mim no Red Hat Entreprise Linux 5.4, Centos 6.5 e 7 e Mac OSX 10.9 (Mavericks). Parece que é o mais portátil, pois o lscpu não está instalado por padrão nesses sistemas. Obrigado!
@BCran Não consegui encontrar _NPROCESSORS_ONLNno POSIX. Você pode criar um link para ele?
Ciro Santilli # 9/15
3
@CiroSantilli No github.com/gstrauss/plasma/blob/master/plasma_sysconf.c , parece que eu estava errado: é apenas opcional. "sysconf _SC_NPROCESSORS_ONLN e _SC_NPROCESSORS_CONF não são exigidos pelos padrões, mas são fornecidos em várias plataformas unix e documentados como opcionais pelo Open Group."
BCRAN
100
Prefácio:
O problema com as /proc/cpuinforespostas baseadas é que elas analisam informações destinadas ao consumo humano e, portanto, não possuem um formato estável projetado para análise de máquinas : o formato de saída pode diferir entre plataformas e condições de tempo de execução; o uso lscpu -pno Linux (e sysctlno macOS) contorna esse problema .
getconf _NPROCESSORS_ONLN/ getconf NPROCESSORS_ONLNnão faz distinção entre CPUs lógicas e físicas .
Aqui está um shtrecho (compatível com POSIX) que funciona no Linux e macOS para determinar o número de CPUs físicas ou lógicas - online ; veja os comentários para detalhes.
Usa lscpupara Linux e sysctlpara macOS.
Nota sobre terminologia : CPU refere-se à menor unidade de processamento, conforme visto pelo sistema operacional. Cada um dos núcleos sem hiper-threading corresponde a 1 CPU, enquanto os núcleos com hiper-threading contêm mais de 1 (normalmente: 2) - lógica - CPU.
O Linux usa a seguinte taxonomia [1] , começando com a menor unidade: nó CPU < núcleo < soquete < livro <,
com cada nível compreendendo 1 ou mais instâncias do próximo nível inferior.
#!/bin/sh# macOS: Use `sysctl -n hw.*cpu_max`, which returns the values of # interest directly.# CAVEAT: Using the "_max" key suffixes means that the *maximum*# available number of CPUs is reported, whereas the# current power-management mode could make *fewer* CPUs # available; dropping the "_max" suffix would report the# number of *currently* available ones; see [1] below.## Linux: Parse output from `lscpu -p`, where each output line represents# a distinct (logical) CPU.# Note: Newer versions of `lscpu` support more flexible output# formats, but we stick with the parseable legacy format # generated by `-p` to support older distros, too.# `-p` reports *online* CPUs only - i.e., on hot-pluggable # systems, currently disabled (offline) CPUs are NOT# reported.# Number of LOGICAL CPUs (includes those reported by hyper-threading cores)# Linux: Simply count the number of (non-comment) output lines from `lscpu -p`, # which tells us the number of *logical* CPUs.
logicalCpuCount=$([ $(uname)='Darwin']&&
sysctl -n hw.logicalcpu_max ||
lscpu -p | egrep -v '^#'| wc -l)# Number of PHYSICAL CPUs (cores).# Linux: The 2nd column contains the core ID, with each core ID having 1 or# - in the case of hyperthreading - more logical CPUs.# Counting the *unique* cores across lines tells us the# number of *physical* CPUs (cores).
physicalCpuCount=$([ $(uname)='Darwin']&&
sysctl -n hw.physicalcpu_max ||
lscpu -p | egrep -v '^#'| sort -u -t,-k 2,4| wc -l)# Print the values.
cat <<EOF
# of logical CPUs: $logicalCpuCount# of physical CPUS: $physicalCpuCount
EOF
Observe que outros sistemas derivados do BSD que não o macOS - por exemplo, FreeBSD - suportam apenas a hw.ncpuchave sysctl, que está obsoleta no macOS; Eu sou incerto sobre qual das novas chaves hw.npucorresponde a: hw.(logical|physical)cpu_[max].
Dica para o @teambob por ajudar a corrigir o lscpucomando físico-CPU-count .
Advertência : a lscpu -psaída NÃO inclui uma coluna "livro" (a manpágina menciona "livros" como uma entidade entre o soquete e o nó na hierarquia taxonômica). Se "livros" estão em jogo em um determinado sistema Linux ( alguém sabe quando e como? ), O comando-CPU-contagem física pode sob -report (isto é baseado na suposição de que lscpurelatórios IDs que são não-exclusivo através maior entidades de nível superior ; por exemplo: 2 núcleos diferentes de 2 soquetes diferentes podem ter o mesmo ID).
Se você salvar o código acima como, digamos, shell scriptcpus , torná-lo executável chmod +x cpuse colocá-lo na pasta $PATH, verá uma saída como a seguinte:
$ cpus
logical 4
physical 4
[1] Xaekai esclarece o que é um livro : "um livro é um módulo que abriga uma placa de circuito com soquetes de CPU, soquetes de RAM, conexões de E / S ao longo da borda e um gancho para integração do sistema de refrigeração. Eles são usados nos mainframes da IBM Mais informações: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
Sim, desculpe, você está correto sobre o comando de classificação. Não consigo encontrar nenhuma informação sobre livros além do manual do lscpu. Eu acho que está relacionado ao NUMA pt.wikipedia.org/wiki/Non-uniform_memory_access
TeamBob
2
Acho que a maioria das soluções aqui ignora máquinas com vários soquetes, diferente desta. Obrigado!
dividebyzero
1
Em termos de linux, há muitos contextos em que o lscpu não está disponível, como imagens do instalador. Eu gosto .. gostaria que fosse onipresente.
Brian Chrisman
43
lscpu reúne o formulário de informações da arquitetura da CPU / proc / cpuinfon no formato legível por humanos:
# lscpuArchitecture: x86_64
CPU op-mode(s):32-bit,64-bit
ByteOrder:LittleEndian
CPU(s):8On-line CPU(s) list:0-7Thread(s) per core:1Core(s) per socket:4
CPU socket(s):2
NUMA node(s):1Vendor ID:GenuineIntel
CPU family:6Model:15Stepping:7
CPU MHz:1866.669BogoMIPS:3732.83Virtualization: VT-x
L1d cache:32K
L1i cache:32K
L2 cache:4096K
NUMA node0 CPU(s):0-7
é "^ core id" para o total de núcleos físicos ou apenas p-núcleos em um processador?
21411 Richard As
1
existe uma linha de identificação do núcleo por núcleo físico exclusivo no sistema. Eu não sei se os números vão começar de novo em zero para um segundo processador físico, no entanto ...
lunixbochs
1
se você tiver mais de um processador físico, também precisará consultar o "ID físico".
Anne
A primeira linha não funcionou para mim. Isso funciona para mim. cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -le mostra o número correto.
Jaylweb 28/02
11
Para o número total de núcleos físicos:
grep '^core id'/proc/cpuinfo |sort -u|wc -l
Em máquinas com vários soquetes (ou sempre), multiplique o resultado acima pelo número de soquetes:
Usar o getconf é realmente a maneira mais portátil, no entanto, a variável tem nomes diferentes no BSD e no Linux para obter o getconf; portanto, você deve testar os dois, conforme sugere esta essência:
https://gist.github.com/jj1bdx/5746298
(também inclui uma correção do Solaris usando o ksh)
No meu, isso retorna o número de hyperthreads. Eu também precisaria saber o número de núcleos físicos e o número de soquetes.
user2465201
OK - exatamente o mesmo comando com hw.physicalcpu gera a contagem de núcleos. Ainda não tenho certeza sobre a contagem de soquetes ... Também há uma contagem "lógica" e "ativa" da CPU, mas não tenho certeza do que isso significa.
User2465201
Atualização rápida - isso não parece tão portátil. Eu tentei em uma caixa Linux, e parece ler apenas os diretórios / proc, que são todos diferentes para o sistema Linux e Mac - por exemplo, não há subdiretório hw. Dito isto, você ainda pode parse / proc / cpuinfo
Conte o número de CPUs lógicas únicas usadas pelo kernel do Linux. A -popção gera saída para fácil análise e é compatível com versões anteriores do lscpu.
Para determinar o número de unidades de processamento disponíveis (não necessariamente o mesmo que o número de núcleos). Isso é compatível com hyperthreading.
nproc
Eu não quero ir muito longe na toca do coelho, mas você também pode determinar o número de processadores configurados (em oposição aos processadores simplesmente disponíveis / on-line) via getconf _NPROCESSORS_CONF. Para determinar o número total de CPUs (offline e online), você deseja analisar a saída de lscpu -ap.
esta é a resposta correta se você quiser núcleos físicos.
Dinesh
3
Eu também pensei cat /proc/cpuinfoque me daria a resposta correta, no entanto, vi recentemente que meu sistema ARM quad core Cortex A53 mostrava apenas um único núcleo. Parece que / proc / cpuinfo mostra apenas os núcleos ativos, enquanto:
cat /sys/devices/system/cpu/present
é uma medida melhor do que está lá. Você também pode
cat /sys/devices/system/cpu/online
para ver quais núcleos estão online e
cat /sys/devices/system/cpu/offline
para ver quais núcleos estão offline. Os online, offlinee presentsysfs entradas retornar o índice das CPUs, portanto, um valor de retorno de 0meio apenas do núcleo 0, enquanto que um valor de retorno de 1-3meios núcleos de 1,2, e 3.
-1, isso retorna 0em um único núcleo com um Opteron 4170 HE, mas retorna 4em uma caixa de oito núcleos com um Opteron 3280. ... parte de mim realmente deseja que essa linha única funcione!
+1, mais longo que a solução com "lscpu -p = Core, Socket", mas funciona analisando diretamente / proc / cpuinfo, sem a necessidade de lscpu.
Fravadona 12/07/19
1
Contar "id principal" por método "id físico" usando awk com fallback back na contagem de "processador" se "id principal" não estiver disponível (como framboesa)
echo $(awk '{ if ($0~/^physical id/) { p=$NF }; if ($0~/^core id/) { cores[p$NF]=p$NF }; if ($0~/processor/) { cpu++ } } END { for (key in cores) { n++ } } END { if (n) {print n} else {print cpu} }'/proc/cpuinfo)
Isso funcionou bem. Quando tentei a primeira resposta, obtive 3 CPUs como saída. Eu sei que tenho 4 CPUs no sistema, então fiz apenas um greppara o processador e a saída ficou assim:
cat
, antesawk
, de qualquer maneira: bastaawk '<script>' /proc/cpuinfo
, assim:awk '/^processor/{n+=1}END{print n}' /proc/cpuinfo
. E você entra sem "menos um".tail -n 1
que leva a última linha e a imprime.Respostas:
contará o número de linhas começando com "processador" em
/proc/cpuinfo
Para sistemas com hiperencadeamento, você pode usar
que deve retornar (por exemplo)
8
(enquanto o comando acima retornaria16
)fonte
grep -c '^processor' /proc/cpuinfo
no zsh.cat /proc/cpuinfo | awk '/^processor/{print $3}' | tail -1
também retornará o número errado se os números da CPU forem baseados em 0.O processamento do conteúdo
/proc/cpuinfo
é desnecessariamente barroco. Use o nproc, que faz parte do coreutils, para que ele esteja disponível na maioria das instalações do Linux.O comando
nproc
imprime o número de unidades de processamento disponíveis para o processo atual, que pode ser menor que o número de processadores online.Para encontrar o número de todos os núcleos / processadores instalados, use
nproc --all
Na minha máquina de 8 núcleos:
fonte
nproc
não é uma parte da boot2dockerA solução mais portátil que encontrei é o
getconf
comando:Isso funciona no Linux e no Mac OS X. Outro benefício disso em relação a outras abordagens é que o getconf existe há muito tempo. Algumas das máquinas Linux mais antigas nas quais tenho que fazer desenvolvimento não têm os comandos
nproc
oulscpu
disponíveis, mas eles têmgetconf
.Nota do editor: Embora o
getconf
utilitário seja obrigatório para POSIX , o específico_NPROCESSORS_ONLN
e os_NPROCESSORS_CONF
valores não são. Dito isto, como afirmado, eles funcionam em plataformas Linux e no macOS; no FreeBSD / PC-BSD, você deve omitir o líder_
.fonte
_NPROCESSORS_ONLN
no POSIX. Você pode criar um link para ele?Prefácio:
O problema com as
/proc/cpuinfo
respostas baseadas é que elas analisam informações destinadas ao consumo humano e, portanto, não possuem um formato estável projetado para análise de máquinas : o formato de saída pode diferir entre plataformas e condições de tempo de execução; o usolscpu -p
no Linux (esysctl
no macOS) contorna esse problema .getconf _NPROCESSORS_ONLN
/getconf NPROCESSORS_ONLN
não faz distinção entre CPUs lógicas e físicas .Aqui está um
sh
trecho (compatível com POSIX) que funciona no Linux e macOS para determinar o número de CPUs físicas ou lógicas - online ; veja os comentários para detalhes.Usa
lscpu
para Linux esysctl
para macOS.Nota sobre terminologia : CPU refere-se à menor unidade de processamento, conforme visto pelo sistema operacional. Cada um dos núcleos sem hiper-threading corresponde a 1 CPU, enquanto os núcleos com hiper-threading contêm mais de 1 (normalmente: 2) - lógica - CPU.
O Linux usa a seguinte taxonomia [1] , começando com a menor unidade: nó
CPU < núcleo < soquete < livro <, com cada nível compreendendo 1 ou mais instâncias do próximo nível inferior.
[1] documentação do macOS
sysctl (3)
Observe que outros sistemas derivados do BSD que não o macOS - por exemplo, FreeBSD - suportam apenas a
hw.ncpu
chavesysctl
, que está obsoleta no macOS; Eu sou incerto sobre qual das novas chaveshw.npu
corresponde a:hw.(logical|physical)cpu_[max]
.Dica para o @teambob por ajudar a corrigir o
lscpu
comando físico-CPU-count .Advertência : a
lscpu -p
saída NÃO inclui uma coluna "livro" (aman
página menciona "livros" como uma entidade entre o soquete e o nó na hierarquia taxonômica). Se "livros" estão em jogo em um determinado sistema Linux ( alguém sabe quando e como? ), O comando-CPU-contagem física pode sob -report (isto é baseado na suposição de quelscpu
relatórios IDs que são não-exclusivo através maior entidades de nível superior ; por exemplo: 2 núcleos diferentes de 2 soquetes diferentes podem ter o mesmo ID).Se você salvar o código acima como, digamos, shell script
cpus
, torná-lo executávelchmod +x cpus
e colocá-lo na pasta$PATH
, verá uma saída como a seguinte:[1] Xaekai esclarece o que é um livro : "um livro é um módulo que abriga uma placa de circuito com soquetes de CPU, soquetes de RAM, conexões de E / S ao longo da borda e um gancho para integração do sistema de refrigeração. Eles são usados nos mainframes da IBM Mais informações: http://ewh.ieee.org/soc/cpmt/presentations/cpmt0810a.pdf "
fonte
lscpu
reúne o formulário de informações da arquitetura da CPU / proc / cpuinfon no formato legível por humanos:Veja também /unix/468766/understanding-output-of-lscpu .
fonte
Isso funcionou para mim.
tail -nX
permite que você pegue apenas as últimas X linhas.Se você tem hyperthreading, isso deve funcionar para capturar o número de núcleos físicos .
fonte
cat /proc/cpuinfo | awk '/^processor/{print $3}'| wc -l
e mostra o número correto.Para o número total de núcleos físicos:
Em máquinas com vários soquetes (ou sempre), multiplique o resultado acima pelo número de soquetes:
@ mklement0 tem uma boa resposta abaixo usando lscpu. Eu escrevi uma versão mais sucinta nos comentários
fonte
Você também pode usar o Python! Para obter o número de núcleos físicos:
Para obter o número de núcleos com hyperthread:
fonte
Solução de plataforma cruzada para Linux, MacOS, Windows:
fonte
Aqui está a maneira que eu uso para contar o número de núcleos físicos que estão online no Linux:
ou em resumo:
Exemplo (1 soquete):
Exemplo (2 tomadas):
Exemplo (4 tomadas):
fonte
Usar o getconf é realmente a maneira mais portátil, no entanto, a variável tem nomes diferentes no BSD e no Linux para obter o getconf; portanto, você deve testar os dois, conforme sugere esta essência: https://gist.github.com/jj1bdx/5746298 (também inclui uma correção do Solaris usando o ksh)
Eu pessoalmente uso:
E se você quiser isso em python, você pode simplesmente usar o syscall getconf, importando o módulo os:
Quanto a
nproc
, faz parte do GNU Coreutils, portanto não está disponível no BSD por padrão. Ele usa sysconf () também após alguns outros métodos.fonte
Se você quiser fazer isso para que ele funcione no linux e no OS X, você pode:
fonte
É muito simples. Basta usar este comando:
fonte
CPU(s):
.Você pode usar um dos seguintes métodos para determinar o número de núcleos físicos da CPU.
Conte o número de IDs principais exclusivos (aproximadamente equivalente a
grep -P '^core id\t' /proc/cpuinfo | sort -u | wc -l
).awk '/^core id\t/ {cores[$NF]++} END {print length(cores)}' /proc/cpuinfo
Multiplique o número de 'núcleos por soquete' pelo número de soquetes.
lscpu | awk '/^Core\(s\) per socket:/ {cores=$NF}; /^Socket\(s\):/ {sockets=$NF}; END{print cores*sockets}'
Conte o número de CPUs lógicas únicas usadas pelo kernel do Linux. A
-p
opção gera saída para fácil análise e é compatível com versões anteriores dolscpu
.lscpu -p | awk -F, '$0 !~ /^#/ {cores[$1]++} END {print length(cores)}'
Apenas para reiterar o que os outros disseram, há várias propriedades relacionadas.
Para determinar o número de processadores disponíveis:
Para determinar o número de unidades de processamento disponíveis (não necessariamente o mesmo que o número de núcleos). Isso é compatível com hyperthreading.
Eu não quero ir muito longe na toca do coelho, mas você também pode determinar o número de processadores configurados (em oposição aos processadores simplesmente disponíveis / on-line) via
getconf _NPROCESSORS_CONF
. Para determinar o número total de CPUs (offline e online), você deseja analisar a saída delscpu -ap
.fonte
Eu também pensei
cat /proc/cpuinfo
que me daria a resposta correta, no entanto, vi recentemente que meu sistema ARM quad core Cortex A53 mostrava apenas um único núcleo. Parece que / proc / cpuinfo mostra apenas os núcleos ativos, enquanto:cat /sys/devices/system/cpu/present
é uma medida melhor do que está lá. Você também pode
cat /sys/devices/system/cpu/online
para ver quais núcleos estão online e
cat /sys/devices/system/cpu/offline
para ver quais núcleos estão offline. Os
online
,offline
epresent
sysfs entradas retornar o índice das CPUs, portanto, um valor de retorno de0
meio apenas do núcleo 0, enquanto que um valor de retorno de1-3
meios núcleos de 1,2, e 3.Consulte https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-system-cpu
fonte
A seguir, você deve fornecer o número de núcleos "reais" em um sistema com ou sem hyperthread. Pelo menos funcionou em todos os meus testes.
fonte
0
em um único núcleo com um Opteron 4170 HE, mas retorna4
em uma caixa de oito núcleos com um Opteron 3280. ... parte de mim realmente deseja que essa linha única funcione!Não é minha página da web, mas esse comando de http://www.ixbrian.com/blog/?p=64&cm_mc_uid=89402252817914508279022&cm_mc_sid_50200000=1450827902 funciona bem para mim no centos. Ele mostrará o cpus real, mesmo quando o hyperthreading estiver ativado.
cat /proc/cpuinfo | egrep "core id|physical id" | tr -d "\n" | sed s/physical/\\nphysical/g | grep -v ^$ | sort | uniq | wc -l
fonte
Contar "id principal" por método "id físico" usando awk com fallback back na contagem de "processador" se "id principal" não estiver disponível (como framboesa)
fonte
Isso funcionou bem. Quando tentei a primeira resposta, obtive 3 CPUs como saída. Eu sei que tenho 4 CPUs no sistema, então fiz apenas um
grep
para o processador e a saída ficou assim:fonte
me dá
Que é contagem tomada correta - olhando acima do
E5-2667
diz-me cada socket tem8 cores
, por isso, se multiplicam e acabar com16 cores
toda2 sockets
.Onde
lscpu
me dê20 CPUs
- o que é totalmente incorreto - não sei por quê. (o mesmo vale paracat /proc/cpu
- termina com20
.fonte
Mais rápido, sem garfo
Este trabalho com quase todos Concha.
Para permanecer compatível com Concha, traço, busyboxe outros, eu usei em
ncore=$((ncore+1))
vez de((ncore++))
.bater versão
fonte
Se não há problema em você usar o Python, o
numexpr
módulo tem uma função para isso:também isso:
Para consultar essas informações no prompt de comando, use:
Ou simplesmente é possível obter essas informações da
multiprocessing.cpu_count()
funçãoOu ainda mais simplesmente, use
os.cpu_count()
fonte
cpu_count
está errado, ele não retorna o número de núcleos, mas apenas o número de hyperthreads em CPUs IntelSe você quiser apenas contar núcleos físicos, esse comando fez isso por mim.
Bastante básico, mas parece contar núcleos físicos reais, ignorando a contagem lógica
fonte
O Python 3 também fornece algumas maneiras simples de obtê-lo:
4
4
fonte
Use a consulta abaixo para obter detalhes principais
fonte
Resumo: para obter CPUs físicas, faça o seguinte:
para obter CPUs físicas e lógicas, faça o seguinte:
/proc
<< esta é a fonte de ouro de qualquer informação necessária sobre processos e/proc/cpuinfo
<< é a fonte de ouro de qualquer informação da CPU.fonte