Anzahl der Prozessoren / Kerne in der Befehlszeile

108

Ich führe den folgenden Befehl aus, um die Anzahl der Prozessoren / Kerne unter Linux abzurufen:

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

Es funktioniert, sieht aber nicht elegant aus. Wie würden Sie vorschlagen, es zu verbessern?

Michael
quelle
Mögliches Duplikat von Erhalten Sie die Anzahl der CPUs / Kerne unter Linux
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Antworten:

138

nproc ist was Sie suchen.

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

pax162
quelle
11
Schön - aber nicht so allgegenwärtig wie / proc / cpuinfo. nprocbefindet sich auf meiner Ubuntu-VM, jedoch nicht auf meinem RedHat 5.5-basierten Computer.
Digitales Trauma
8
Stellen Sie sicher, dass nproc --allfür alle installierten Verarbeitungseinheiten. Ohne --allwerden nprocnur Verarbeitungseinheiten angezeigt, die für den aktuellen Prozess verfügbar sind. Lesen Sie die Manpage für weitere Details. MMV.
JamesThomasMoon1979
96

Das einfachste Tool wird mit glibc geliefert und heißt getconf:

$ getconf _NPROCESSORS_ONLN
4
Harald Hoyer
quelle
8
Noch besser ist, dass es sich um ein POSIX-Dienstprogramm handelt: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
Im Gegensatz nprocdazu funktioniert dies (standardmäßig) auf Mac OS X.
Alec Jacobson
Obwohl dieses Dienstprogramm unter Solaris verfügbar ist _NPROCESSORS_ONLN(oder irgendetwas mit CPU, Proc usw.), ist es leider in seiner Ausgabe aufgeführt. Ich hatte gehofft, da es sich um ein Posix-Tool handelt, das unter Linux / Solaris funktioniert, musste ich keine Verzweigung verwenden.
Brian Vandenberg
39

Ich denke, die Methode, die Sie angeben, ist unter Linux die portabelste. Anstatt unnötiges Laichen catund wcProzesse zu erzeugen, können Sie es ein wenig verkürzen:

$ grep --count ^processor /proc/cpuinfo
2
Digitales Trauma
quelle
25

Wenn Sie dies tun möchten, damit es unter Linux und OS X funktioniert, können Sie Folgendes tun:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
quelle
schönes tragbares Skript :)
mircealungu
2
Unter Solaris müssen Sie psrinfo -pstattdessen
mems
14

Bei neueren Kerneln können Sie möglicherweise auch die /sys/devices/system/cpu/Schnittstelle verwenden, um weitere Informationen zu erhalten:

$ 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

Weitere Informationen dazu, was all dies bedeutet, finden Sie in den offiziellen Dokumenten .

Digitales Trauma
quelle
2
nproc verwendet dies meistens ($ OMP_NUM_THREADS, dann readdir sysfs). Ich denke, dies ist die bessere Schnittstelle.
Tobu
2
Und getconf verlässt sich auch auf diese Schnittstelle (die onlineDatei, einfacher als das, was nproc tut)
Tobu
6

Wenn jemand nach "der Anzahl der Prozessoren / Kerne" fragt, werden 2 Antworten angefordert. Die Anzahl der "Prozessoren" entspricht der physischen Anzahl, die in den Sockeln des Computers installiert ist.

Die Anzahl der "Kerne" wäre physikalische Kerne. Hyperthreaded (virtuelle) Kerne wären nicht enthalten (zumindest meiner Meinung nach). Als jemand, der viele Programme mit Thread-Pools schreibt, müssen Sie wirklich die Anzahl der physischen Kerne im Vergleich zu Kernen / Hyperthreads kennen. Sie können jedoch das folgende Skript ändern, um die gewünschten Antworten zu erhalten.

#!/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"

Das Ergebnis auf einer Maschine mit 2 physischen Xeon X5650-Prozessoren des Modells mit jeweils 6 physischen Kernen, die auch Hyperthreading unterstützen:

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

Auf einem Computer mit 2 mdeol Xeon E5472-Prozessoren mit jeweils 4 physischen Kernen, die kein Hyperthreading unterstützen

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
Rabinnh
quelle
Dies ist die gründlichste Antwort, die mir die Informationen gab, nach denen ich gesucht habe.
woodToaster
4

Der lscpu(1)vom util-linux- Projekt bereitgestellte Befehl kann auch nützlich sein:

$ 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
quelle
1

Dies ist für diejenigen gedacht, die auf tragbare Weise CPU-Kerne auf * bsd, * nix oder solaris zählen möchten (haben nicht auf aix und hp-ux getestet, sollten aber funktionieren). Es hat immer für mich funktioniert.

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

Solaris grep& egrepkeine -oOption haben, sedwird stattdessen verwendet.

Gwillie
quelle
1

Ein weiterer Ein-liner, ohne Zählen hyperGewindeKerne :

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

Wenn Sie eine os-unabhängige Methode benötigen, funktioniert sie unter Windows und Linux. Verwenden Sie Python

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