J'exécute la commande suivante pour obtenir le nombre de processeurs/cœurs sous Linux:
cat /proc/cpuinfo | grep processor | wc -l
Cela fonctionne mais cela n'a pas l'air élégant. Comment suggéreriez-vous l'améliorer?
nproc
est ce que vous recherchez.
Plus ici: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
L'outil le plus simple est fourni avec glibc et s'appelle getconf
:
$ getconf _NPROCESSORS_ONLN
4
Je pense que la méthode que vous donnez est la plus portable sur Linux. Au lieu de générer des processus cat
et wc
inutiles, vous pouvez le raccourcir un peu:
$ grep --count ^processor /proc/cpuinfo
2
Si vous voulez faire cela pour que cela fonctionne sous Linux et OS X, vous pouvez faire:
CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
Sur les nouveaux noyaux, vous pouvez aussi éventuellement utiliser l'interface /sys/devices/system/cpu/
pour obtenir un peu plus d'informations:
$ 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
Voir les documents officiels pour plus d'informations sur ce que tout cela signifie.
Lorsque quelqu'un demande "le nombre de processeurs/cœurs", deux réponses sont demandées. Le nombre de "processeurs" serait le nombre physique installé dans les sockets de la machine.
Le nombre de "cœurs" serait des cœurs physiques. Les cœurs hyperthreadés (virtuels) ne seraient pas inclus (du moins à mon avis). En tant que personne qui écrit beaucoup de programmes avec des pools de threads, vous devez vraiment connaître le nombre de cœurs physiques par rapport aux cœurs/hyperthreads. Cela dit, vous pouvez modifier le script suivant pour obtenir les réponses dont vous avez besoin.
#!/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"
Résultat: une machine dotée de 2 processeurs physiques Xeon X5650 dotés chacun de 6 cœurs physiques prenant également en charge l'hyperthreading:
Type model name : Intel(R) Xeon(R) CPU X5650 @ 2.67GHz
Processors 2
Physical cores 12
Including hyperthreading cores 24
Sur une machine équipée de 2 processeurs mdeol Xeon E5472 dotés chacun de 4 cœurs physiques ne prenant pas en charge l'hyperthreading
Type model name : Intel(R) Xeon(R) CPU E5472 @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
La commande lscpu(1)
fournie par le projet til-linux pourrait également être 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
Une autre ligne, sans comptage noyaux hyper-threadés:
lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }'
Ceci est destiné à ceux qui veulent un moyen portable de compter les cœurs de processeur sur * bsd, * nix ou solaris (n’ont pas été testés sur aix et hp-ux mais devraient fonctionner). Cela a toujours fonctionné pour moi.
dmesg | \
egrep 'cpu[. ]?[0-9]+' | \
sed 's/^.*\(cpu[. ]*[0-9]*\).*$/\1/g' | \
sort -u | \
wc -l | \
tr -d ' '
solaris grep
& egrep
ne dispose pas de l'option -o
, de sorte que sed
est utilisé à la place.
Si vous avez besoin d'une méthode indépendante du système d'exploitation, fonctionne sous Windows et Linux. Utiliser python
$ python -c 'import multiprocessing as m; print m.cpu_count()'
16