Número de processadores / núcleos na linha de comando

108

Estou executando o seguinte comando para obter o número de processadores / núcleos no Linux:

cat /proc/cpuinfo | grep processor | wc -l

Funciona, mas não parece elegante. Como você sugere melhorá-lo?

Michael
fonte
possível duplicata de Obtenha o número de CPUs / núcleos no Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

138

nproc é o que você está procurando.

Mais aqui: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

pax162
fonte
11
Legal - mas não tão onipresente quanto / proc / cpuinfo. nprocestá lá na minha VM ubuntu, mas não na minha máquina baseada em RedHat 5.5.
Digital Trauma
8
Certifique-se de nproc --allpara todas as unidades de processamento instaladas. Sem --all, nprocmostra apenas as Unidades de Processamento disponíveis para o processo atual. Leia a página do manual para mais detalhes. MMV.
JamesThomasMoon1979
96

A ferramenta mais simples vem com glibc e é chamada de getconf:

$ getconf _NPROCESSORS_ONLN
4
Harald Hoyer
fonte
8
Melhor ainda, é um utilitário POSIX: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
ao contrário nproc, isso funciona (por padrão) no mac os x.
Alec Jacobson
Infelizmente, embora este utilitário esteja disponível no Solaris, _NPROCESSORS_ONLN(ou qualquer coisa com cpu, proc, etc) está listado em sua saída. Eu esperava que, por ser uma ferramenta posix, ela funcionasse no Linux / Solaris, então não tive que usar ramificações.
Brian Vandenberg,
39

Acho que o método que você fornece é o mais portátil no Linux. Em vez de gerar processos cate desnecessários wc, você pode encurtá-lo um pouco:

$ grep --count ^processor /proc/cpuinfo
2
Trauma Digital
fonte
25

Se você quiser fazer isso para funcionar no Linux e no OS X, pode fazer:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
fonte
bom script portátil :)
mircealungu
2
No Solaris, você precisa usar em seu psrinfo -plugar
memos de
14

Em kernels mais recentes, você também pode usar a /sys/devices/system/cpu/interface para obter um pouco mais de informações:

$ ls /sys/devices/system/cpu/
cpu0  cpufreq  kernel_max  offline  possible  present  release
cpu1  cpuidle  modalias    online   power     probe    uevent
$ cat /sys/devices/system/cpu/kernel_max 
255
$ cat /sys/devices/system/cpu/offline 
2-63
$ cat /sys/devices/system/cpu/possible 
0-63
$ cat /sys/devices/system/cpu/present 
0-1
$ cat /sys/devices/system/cpu/online 
0-1

Consulte os documentos oficiais para obter mais informações sobre o que tudo isso significa.

Trauma Digital
fonte
2
nproc usa isto, principalmente ($ OMP_NUM_THREADS então readdir sysfs). Acho que esta é a melhor interface.
Tobu
2
E getconf também depende dessa interface (o onlinearquivo, mais simples do que o nproc)
Tobu
6

Quando alguém pergunta "o número de processadores / núcleos", há 2 respostas solicitadas. O número de "processadores" seria o número físico instalado nos soquetes da máquina.

O número de "núcleos" seria núcleos físicos. Núcleos hyperthreaded (virtuais) não seriam incluídos (pelo menos em minha opinião). Como alguém que escreve muitos programas com pools de threads, você realmente precisa saber a contagem de núcleos físicos vs núcleos / hyperthreads. Dito isso, você pode modificar o script a seguir para obter as respostas de que precisa.

#!/bin/bash

MODEL=`cat /cpu/procinfo | grep "model name" | sort | uniq`
ALL=`cat /proc/cpuinfo | grep "bogo" | wc -l`
PHYSICAL=`cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l`
CORES=`cat /proc/cpuinfo | grep "cpu cores" | sort | uniq | cut -d':' -f2`
PHY_CORES=$(($PHYSICAL * $CORES))
echo "Type $MODEL"
echo "Processors $PHYSICAL"
echo "Physical cores $PHY_CORES"
echo "Including hyperthreading cores $ALL"

O resultado em uma máquina com 2 processadores físicos modelo Xeon X5650, cada um com 6 núcleos físicos que também suportam hyperthreading:

Type model name : Intel(R) Xeon(R) CPU           X5650  @ 2.67GHz
Processors 2
Physical cores 12
Including hyperthreading cores 24

Em uma máquina com 2 processadores mdeol Xeon E5472, cada um com 4 núcleos físicos que não oferecem suporte a hyperthreading

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
Rabinnh
fonte
Esta é a resposta mais completa que me forneceu as informações que eu procurava.
woodenToaster de
4

O lscpu(1)comando fornecido pelo projeto util-linux também pode ser útil:

$ 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:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Model name:            Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz
Stepping:              9
CPU MHz:               3406.253
CPU max MHz:           3600.0000
CPU min MHz:           1200.0000
BogoMIPS:              5787.10
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              4096K
NUMA node0 CPU(s):     0-3
mtk
fonte
1

Isso é para aqueles que desejam uma maneira portátil de contar núcleos de CPU em * bsd, * nix ou solaris (não testei em aix e hp-ux, mas deve funcionar). Sempre trabalhou para mim.

dmesg | \
egrep 'cpu[. ]?[0-9]+' | \
sed 's/^.*\(cpu[. ]*[0-9]*\).*$/\1/g' | \
sort -u | \
wc -l | \
tr -d ' '

solaris grepe egrepnão tem -oopção, então sedé usado em seu lugar.

gwillie
fonte
1

Outro one-liner, sem contar núcleos hyper-threaded :

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 
Marco
fonte
0

Se você precisa de um método independente do sistema operacional, funciona em Windows e Linux. Use python

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
Meitham
fonte