Chciałem dowiedzieć się, ile rdzeni ma mój system, więc szukałem tego samego pytania w Google. Mam kilka poleceń, takich jak lscpu
polecenie. Po wypróbowaniu tego polecenia otrzymałem następujący wynik:
$ 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: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 23
Stepping: 10
CPU MHz: 1998.000
BogoMIPS: 5302.48
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 2048K
NUMA node0 CPU(s): 0-3
W szczególności dane wyjściowe pokazują:
- Procesory: 4
- Rdzeń na gniazdo: 4
- Rodzina procesorów: 6
Który z nich wskazuje rdzenie systemu Linux?
Czy jest jakieś inne polecenie określające liczbę rdzeni, czy też zakładam, że jest całkowicie błędne?
Odpowiedzi:
Musisz spojrzeć na gniazda i rdzenie na gniazdo. W tym przypadku masz 1 fizyczny procesor (gniazdo), który ma 4 rdzenie (rdzenie na gniazdo).
źródło
nproc
, odzyskam 4. Używająccat /proc/cpuinfo
otrzymuję 4, a zatem wydaje się, że ta odpowiedź jest zła, przynajmniej w mojej sytuacji.Aby uzyskać pełny obraz, musisz spojrzeć na liczbę wątków na rdzeń, rdzenie na gniazdo i gniazda . Jeśli pomnożycie te liczby, otrzymacie liczbę procesorów w systemie.
Procesory są tym, co widać po uruchomieniu
htop
(nie są równe procesorom fizycznym).Oto przykład z komputera stacjonarnego:
I serwer:
Wyjście
nproc
odpowiada liczbie procesorów odlscpu
. W przypadku komputera stacjonarnego powyżej powinno to być 8 procesorów zgłoszonych przezlscpu
:Dane wyjściowe
/proc/cpuinfo
powinny pasować do tych informacji, na przykład w powyższym systemie stacjonarnym widać, że jest 8 procesorów (procesorów) i 4 rdzenie (identyfikator rdzenia 0-3):cpu cores
Donosi/proc/cpuinfo
odpowiadaCore(s) per socket
donosilscpu
. W przypadku komputera stacjonarnego powyżej powinno to odpowiadać 4 rdzeniom na gniazdo zgłoszonym przez lscpu:Aby dokładnie odpowiedzieć na twoje pytanie, powiedz, ile masz rdzeni, mnożąc liczbę rdzeni na gniazdo przez liczbę gniazd.
Na przykładowe systemy powyżej pulpitu mają 4 rdzenie:
Podczas gdy serwer ma 16:
Innym przydatnym narzędziem jest to,
dmidecode
które dane wyjściowe przypadają na gniazdo. W przypadku wyżej wymienionego systemu serwerów oczekujemy 8 rdzeni na gniazdo i 16 wątków na gniazdo:lscpu
Komenda posiada wiele przydatnych opcji, które może chcesz sprawdzić, na przykład:Zobacz
man lscpu
szczegóły.W podsumowaniu:
źródło
lscpu --all --extended
byłoby przydatnym dodatkiem, ale nie mam już dostępu do tych konkretnych maszyn.lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Socket(s) * Core(s) per socket
. Biorąc pod uwagę to, co właśnie powiedziałem, myślę, żeecho Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))
byłoby lepiej, aby ludzie mogli dokładnie zobaczyć, co się rozmnaża ...Możesz uzyskać te informacje za pomocą
nproc(1)
poleceniaNie wymaga uprawnień roota.
źródło
Aby odpowiedź nie była myląca, musisz zrozumieć kilka prostych koncepcji architektury komputerowej:
Istnieją różne rodzaje instrukcji. Logika decyzyjna wewnątrz CPU wysyła różne instrukcje do różnych jednostek sprzętowych . Na przykład instrukcje arytmetyczne są w rzeczywistości wykonywane przez ALU (jednostkę arytmetyczną / logiczną), podczas gdy instrukcje ładujące / przechowujące z pamięci są wykonywane przez jakąś jednostkę pamięci .
Rdzeń odnosi się do zestawu sprzętu rzeczywistego wykonania (czyli każdy rdzeń ma ALU, jednostkę pamięci, etc ...)
Możesz mieć wiele procesorów, które współużytkują jeden rdzeń - nazywa się to hyperthreading.
Gniazdo jest fizyczne szczelina na płycie głównej, w którym układ scalony jest umieszczony. Ten układ ma pewną liczbę rdzeni.
Przykłady:
Przykład PO:
Inny przykład:
Dwa fizyczne gniazda, każde zawierające układ z 4 fizycznymi rdzeniami, co daje w sumie 8 rdzeni. Dwa wątki wysyłają instrukcje do każdego rdzenia (ta maszyna ma hyperthreading), co oznacza, że do każdego rdzenia muszą być podłączone dwa procesory, co daje łącznie 8 * 2 = 16 procesorów
Pierwsza maszyna może wykonywać dokładnie cztery instrukcje w danym momencie i okresie. Druga maszyna może wykonać od 8 do 16 instrukcji w dowolnym momencie: 16 zostanie osiągnięte tylko wtedy, gdy każda para procesorów wykonuje różne typy instrukcji, dzięki czemu może współdzielić rdzeń bez czekania.
źródło
Możesz także użyć polecenia,
cat /proc/cpuinfo
które wyświetli porcję danych dla każdego rdzenia. Każda porcja zaczyna się od tych informacji:Rdzenie są numerowane od 0, więc jeśli ostatnia porcja mówi
processor : 3
tak jak w tym przypadku, twoja maszyna ma 4 rdzenie.źródło
grep -c ^processor /proc/cpuinfo
(getconf jest częścią glibc)
źródło
getconf _NPROCESSORS_CONF
dostaje liczbę skonfigurowanych procesorów. Możesz uzyskać wartość obu tych makr również w kodzie źródłowym C, używającsysconf()
funkcji. Wpiszman sysconf
więcej informacji.źródło
t 4
robi dmidecode? Jak mnożą się liczby i włączone linie? Czy twój przykład pokazuje 2 rdzenie, 6, 12, 24 lub inną liczbę?4
jestprocessor
, patrz linux.die.net/man/8/dmidecode . Ale używanie4
jako argumentu jest złą praktyką.bash: dmidecode: command not found
To wszystko czego potrzebujesz. Jest to liczba rdzeni online, niezależnie od tego, czy hiperwątkowanie jest włączone, czy wyłączone.
Kolejny łatwy sposób.
źródło
ls -d /sys/devices/system/cpu/cpu* | wc -l
pokazało 49, ponieważ istnieje katalogcpuidle
międzycpuN
katalogami.Znalazłem w ten sposób:
źródło
Chcę tylko dodać trochę informacji do odpowiedzi @htaccess.
W CentOS 6.x dmidecode nie wyświetla informacji o liczbie rdzeni / wątków i faktycznie traktuje „CPU” jako „CPU” lub „Core” w lscpu, a nie „socket”.
źródło
Rodzina procesorów nie ma tu znaczenia.
W twoim przypadku masz w sumie 4 pełne rdzenie.
Co również może być ważne, to „Wątki na rdzeń”. Ale masz 1, więc nie w twoim przypadku.
źródło
Cores = Cores per socket X Sockets
patrz opis w mojej odpowiedzi.Prostym sposobem ustalenia liczby procesorów jest wydanie poniższych poleceń:
źródło