it-swarm.com.de

Anzahl der Prozessoren / Kerne in der Befehlszeile

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

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

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

106
Michael
136
pax162

Das einfachste Tool kommt mit glibc und heißt getconf:

$ getconf _NPROCESSORS_ONLN
4
95
Harald Hoyer

Ich denke, die Methode, die Sie angeben, ist die portabelste unter Linux. Anstatt unnötige cat und wc Prozesse zu erzeugen, können Sie sie ein wenig verkürzen:

$ grep --count ^processor /proc/cpuinfo
2
39
Digital Trauma

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)
23
tim_yates

Auf neueren Kerneln können Sie möglicherweise auch das /sys/devices/system/cpu/ Interface um ein bisschen mehr Informationen zu bekommen:

$ 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

Siehe die offiziellen Dokumente für weitere Informationen darüber, was all dies bedeutet.

14
Digital Trauma

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 (zumindest meiner Meinung nach) nicht enthalten. Als jemand, der viele Programme mit Thread-Pools schreibt, müssen Sie die Anzahl der physischen Kerne im Vergleich zu Kernen/Hyperthreads genau kennen. Das heißt, Sie können das folgende Skript ändern, um die Antworten zu erhalten, die Sie benötigen.

#!/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 Prozessoren des Modells Xeon X5650 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
6
rabinnh

Der Befehl lscpu(1), der vom Projekt til-linux bereitgestellt wird, 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
4
mtk

Ein weiterer Einzeiler, ohne Zählen Hyper-Threaded-Kerne:

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

Dies ist für diejenigen gedacht, die auf portable Weise CPU-Kerne auf * bsd, * nix oder solaris zählen möchten (nicht auf aix und hp-ux getestet, sollte 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 & egrep haben -o Option, sodass stattdessen sed verwendet wird.

1
gwillie

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
0
Meitham