Sto eseguendo il seguente comando per ottenere il numero di processori / core in Linux:
cat /proc/cpuinfo | grep processor | wc -l
Funziona ma non sembra elegante. Come suggeriresti di migliorarlo?
Sto eseguendo il seguente comando per ottenere il numero di processori / core in Linux:
cat /proc/cpuinfo | grep processor | wc -l
Funziona ma non sembra elegante. Come suggeriresti di migliorarlo?
Risposte:
nproc
è quello che stai cercando.
Maggiori informazioni qui: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
nproc
è presente sulla mia macchina virtuale Ubuntu, ma non sulla mia macchina basata su RedHat 5.5.
nproc --all
per tutte le unità di elaborazione installate. Senza --all
, nproc
mostra solo le unità di elaborazione disponibili per il processo corrente. Leggi la pagina man per maggiori dettagli. MMV.
Lo strumento più semplice viene fornito con glibc e si chiama getconf
:
$ getconf _NPROCESSORS_ONLN
4
nproc
, funziona (per impostazione predefinita) su mac os x.
_NPROCESSORS_ONLN
(o qualsiasi altra cosa con cpu, proc, ecc.) È elencata nel suo output. Speravo che dal momento che è uno strumento posix funzionasse su Linux / Solaris, quindi non ho dovuto usare il branching.
Penso che il metodo che offri sia il più portabile su Linux. Invece di generare processi cat
e non necessari wc
, puoi accorciarlo un po ':
$ grep --count ^processor /proc/cpuinfo
2
Se vuoi farlo in modo che funzioni su Linux e OS X, puoi fare:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
psrinfo -p
invece usare
Sui kernel più recenti potresti anche usare l' /sys/devices/system/cpu/
interfaccia per ottenere un po 'più di informazioni:
$ 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
Vedere i documenti ufficiali per ulteriori informazioni su cosa significano tutti questi.
online
file, più semplice di quello che fa nproc)
Quando qualcuno chiede "il numero di processori / core" vengono richieste 2 risposte. Il numero di "processori" sarebbe il numero fisico installato nei socket della macchina.
Il numero di "core" sarebbe core fisici. I core hyperthread (virtuali) non sarebbero inclusi (almeno secondo me). Come qualcuno che scrive molti programmi con pool di thread, devi davvero conoscere il conteggio dei core fisici rispetto ai core / hyperthread. Detto questo, puoi modificare il seguente script per ottenere le risposte di cui hai bisogno.
#!/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"
Il risultato su una macchina con 2 processori fisici modello Xeon X5650, ciascuno con 6 core fisici che supportano anche l'hyperthreading:
Type model name : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
Processors 2
Physical cores 12
Including hyperthreading cores 24
Su una macchina con 2 processori mdeol Xeon E5472 ciascuno con 4 core fisici che non supportano l'hyperthreading
Type model name : Intel(R) Xeon(R) CPU E5472 @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
Anche il lscpu(1)
comando fornito dal progetto util-linux potrebbe essere utile:
$ 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
Questo è per coloro che vogliono un modo portatile per contare i core della cpu su * bsd, * nix o solaris (non sono stati testati su aix e hp-ux ma dovrebbero funzionare). Ha sempre funzionato per me.
dmesg | \
egrep 'cpu[. ]?[0-9]+' | \
sed 's/^.*\(cpu[. ]*[0-9]*\).*$/\1/g' | \
sort -u | \
wc -l | \
tr -d ' '
solaris grep
e egrep
non hanno -o
opzioni, quindi sed
viene utilizzato al suo posto.