Liczba procesorów / rdzeni w wierszu poleceń

109

Uruchamiam następujące polecenie, aby uzyskać liczbę procesorów / rdzeni w systemie Linux:

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

Działa, ale nie wygląda elegancko. Jak możesz to poprawić?

Michael
źródło
możliwy duplikat Uzyskaj liczbę procesorów / rdzeni w systemie Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

138

nproc jest tym, czego szukasz.

Więcej tutaj: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/

pax162
źródło
11
Ładnie - ale nie tak wszechobecny jak / proc / cpuinfo. nprocznajduje się na mojej maszynie wirtualnej ubuntu, ale nie na mojej maszynie opartej na RedHat 5.5.
Digital Trauma
8
Upewnij się, że nproc --alldla wszystkich zainstalowanych jednostek przetwarzania. Bez --all, nprocpokazuje tylko jednostki przetwarzania dostępne dla bieżącego procesu. Przeczytaj stronę podręcznika, aby uzyskać więcej informacji. MMV.
JamesThomasMoon1979
96

Najprostsze narzędzie jest dostarczane z glibc i nazywa się getconf:

$ getconf _NPROCESSORS_ONLN
4
Harald Hoyer
źródło
8
Co więcej, jest to narzędzie POSIX: pubs.opengroup.org/onlinepubs/009604499/utilities/getconf.html .
BCran
2
w przeciwieństwie do nproctego działa (domyślnie) w systemie Mac OS X.
Alec Jacobson
Niestety, chociaż to narzędzie jest dostępne w systemie Solaris _NPROCESSORS_ONLN(lub cokolwiek z procesorem cpu, proc itp.) Jest wymienione w jego danych wyjściowych. Miałem nadzieję, że ponieważ jest to narzędzie posix, będzie działać w systemie Linux / Solaris, więc nie musiałem używać rozgałęziania.
Brian Vandenberg,
39

Myślę, że metoda, którą podajesz, jest najbardziej przenośna w systemie Linux. Zamiast odradzać niepotrzebne cati wcprocesy, możesz je nieco skrócić:

$ grep --count ^processor /proc/cpuinfo
2
Cyfrowa trauma
źródło
25

Jeśli chcesz to zrobić, aby działało na Linuksie i OS X, możesz zrobić:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
źródło
fajny przenośny skrypt :)
mircealungu
2
W Solarisie musisz użyć psrinfo -pzamiast tego
memy
14

W nowszych jądrach możesz również użyć /sys/devices/system/cpu/interfejsu, aby uzyskać trochę więcej informacji:

$ 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

Zobacz oficjalne dokumenty, aby uzyskać więcej informacji o tym, co to wszystko oznacza.

Cyfrowa trauma
źródło
2
nproc używa tego głównie ($ OMP_NUM_THREADS, a następnie readdir sysfs). Myślę, że ten jest lepszy interfejs.
Tobu,
2
Getconf również opiera się na tym interfejsie ( onlineplik, prostszy niż to, co robi nproc)
Tobu,
6

Gdy ktoś zapyta o „liczbę procesorów / rdzeni”, wymagane są 2 odpowiedzi. Liczba „procesorów” byłaby liczbą fizyczną zainstalowaną w gniazdach na komputerze.

Liczba „rdzeni” odpowiadałaby rdzeniom fizycznym. Rdzenie hiperwątkowe (wirtualne) nie zostałyby uwzględnione (przynajmniej według mnie). Jako ktoś, kto pisze wiele programów z pulami wątków, naprawdę musisz znać liczbę rdzeni fizycznych w porównaniu z rdzeniami / hiperwątkami. To powiedziawszy, możesz zmodyfikować następujący skrypt, aby uzyskać odpowiedzi, których potrzebujesz.

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

Wynik na maszynie z 2 modelami procesorów fizycznych Xeon X5650, każdy z 6 fizycznymi rdzeniami, które również obsługują technologię wielowątkowości:

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

Na komputerze z 2 procesorami mdeol Xeon E5472, każdy z 4 fizycznymi rdzeniami, które nie obsługują wielowątkowości

Type model name : Intel(R) Xeon(R) CPU           E5472  @ 3.00GHz
Processors 2
Physical cores 8
Including hyperthreading cores 8
rabinnh
źródło
To najdokładniejsza odpowiedź, która dała mi informacje, których szukałem.
woodenToaster
4

lscpu(1)Polecenie przekazane przez util-linux projektu może również być przydatne:

$ 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
źródło
1

To jest dla tych, którzy chcą przenośnego sposobu liczenia rdzeni procesora na * bsd, * nix lub solaris (nie testowano na aix i hp-ux, ale powinno działać). Zawsze mi się to udało.

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

solaris grepi egrepnie mają -oopcji, więc sedjest używany zamiast tego.

gwillie
źródło
1

Kolejna linijka, bez liczenia rdzeni hiperwątkowych :

lscpu | awk -F ":" '/Core/ { c=$2; }; /Socket/ { print c*$2 }' 
Marco
źródło
0

Jeśli potrzebujesz metody niezależnej od systemu operacyjnego, działa w systemach Windows i Linux. Użyj Pythona

$ python -c 'import multiprocessing as m; print m.cpu_count()'
16
Meitham
źródło