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?
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?
Respostas:
nproc
é o que você está procurando.
Mais aqui: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
nproc
está lá na minha VM ubuntu, mas não na minha máquina baseada em RedHat 5.5.
nproc --all
para todas as unidades de processamento instaladas. Sem --all
, nproc
mostra apenas as Unidades de Processamento disponíveis para o processo atual. Leia a página do manual para mais detalhes. MMV.
A ferramenta mais simples vem com glibc e é chamada de getconf
:
$ getconf _NPROCESSORS_ONLN
4
nproc
, isso funciona (por padrão) no mac os x.
_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.
Acho que o método que você fornece é o mais portátil no Linux. Em vez de gerar processos cat
e desnecessários wc
, você pode encurtá-lo um pouco:
$ grep --count ^processor /proc/cpuinfo
2
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)
psrinfo -p
lugar
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.
online
arquivo, mais simples do que o nproc)
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
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
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 grep
e egrep
não tem -o
opção, então sed
é usado em seu lugar.