Nombre de processeurs / cœurs en ligne de commande

109

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érez-vous l'améliorer?

Michael
la source
duplication possible de Obtenir le nombre de processeurs / cœurs sous Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

138

nproc est ce que vous recherchez.

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

pax162
la source
11
Bien - mais pas aussi omniprésent que / proc / cpuinfo. nprocest là sur ma VM ubuntu, mais pas sur ma machine basée sur RedHat 5.5.
Digital Trauma
8
Assurez-vous que nproc --allpour toutes les unités de traitement installées. Sans --all, nprocaffiche uniquement les unités de traitement disponibles pour le processus en cours. Lisez la page de manuel pour plus de détails. MMV.
JamesThomasMoon1979
96

L'outil le plus simple est fourni avec la glibc et s'appelle getconf:

$ getconf _NPROCESSORS_ONLN
4
Harald Hoyer
la source
8
Mieux encore, c'est un utilitaire POSIX: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
contrairement nproc, cela fonctionne (par défaut) sur mac os x.
Alec Jacobson
Malheureusement, bien que cet utilitaire soit disponible sur Solaris, _NPROCESSORS_ONLN(ou tout autre élément avec cpu, proc, etc.) est répertorié dans sa sortie. J'espérais que comme c'est un outil posix, il fonctionnerait sous Linux / Solaris, donc je n'ai pas eu à utiliser le branchement.
Brian Vandenberg du
39

Je pense que la méthode que vous donnez est la plus portable sur Linux. Au lieu de générer des processus catet des wcprocessus inutiles , vous pouvez le raccourcir un peu:

$ grep --count ^processor /proc/cpuinfo
2
Traumatisme numérique
la source
25

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)
tim_yates
la source
nice portable script :)
mircealungu
2
Sur Solaris, vous devez utiliser à la psrinfo -pplace
mems
14

Sur les noyaux plus récents, vous pouvez également utiliser l' /sys/devices/system/cpu/interface 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 la documentation officielle pour plus d'informations sur ce que tout cela signifie.

Traumatisme numérique
la source
2
nproc l'utilise principalement ($ OMP_NUM_THREADS puis readdir sysfs). Je pense que celui-ci est la meilleure interface.
Tobu
2
Et getconf s'appuie également sur cette interface (le onlinefichier, plus simple que ce que fait nproc)
Tobu
6

Quand quelqu'un demande "le nombre de processeurs / cœurs", 2 réponses sont demandées. Le nombre de "processeurs" serait le nombre physique installé dans les sockets sur la machine.

Le nombre de "cœurs" serait constitué de cœurs physiques. Les cœurs hyperthreads (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"

Le résultat sur une machine avec 2 modèles de processeurs physiques Xeon X5650 chacun avec 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 avec 2 processeurs mdeol Xeon E5472 chacun avec 4 cœurs physiques qui ne prend 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
rabinnh
la source
C'est la réponse la plus complète qui m'a donné les informations que je recherchais.
WoodenToaster
4

La lscpu(1)commande fournie par le projet util-linux peut é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
mtk
la source
1

Ceci est pour ceux qui veulent un moyen portable de compter les cœurs de processeur sur * bsd, * nix ou solaris (pas testé sur aix et hp-ux mais devrait 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& egrepdon't have -ooption so sedest utilisé à la place.

gwillie
la source
1

Un autre one-liner, sans compter les noyaux hyper-threadés :

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

Si vous avez besoin d'une méthode indépendante du système d'exploitation, fonctionne sous Windows et Linux. Utilisez python

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