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ć?
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ć?
Odpowiedzi:
nproc
jest tym, czego szukasz.
Więcej tutaj: http://www.cyberciti.biz/faq/linux-get-number-of-cpus-core-command/
nproc
znajduje się na mojej maszynie wirtualnej ubuntu, ale nie na mojej maszynie opartej na RedHat 5.5.
nproc --all
dla wszystkich zainstalowanych jednostek przetwarzania. Bez --all
, nproc
pokazuje tylko jednostki przetwarzania dostępne dla bieżącego procesu. Przeczytaj stronę podręcznika, aby uzyskać więcej informacji. MMV.
Najprostsze narzędzie jest dostarczane z glibc i nazywa się getconf
:
$ getconf _NPROCESSORS_ONLN
4
nproc
tego działa (domyślnie) w systemie Mac OS X.
_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.
Myślę, że metoda, którą podajesz, jest najbardziej przenośna w systemie Linux. Zamiast odradzać niepotrzebne cat
i wc
procesy, możesz je nieco skrócić:
$ grep --count ^processor /proc/cpuinfo
2
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)
psrinfo -p
zamiast tego
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.
online
plik, prostszy niż to, co robi nproc)
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
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
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 grep
i egrep
nie mają -o
opcji, więc sed
jest używany zamiast tego.