Jak poznać liczbę rdzeni systemu w systemie Linux?


231

Chciałem dowiedzieć się, ile rdzeni ma mój system, więc szukałem tego samego pytania w Google. Mam kilka poleceń, takich jak lscpupolecenie. 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?


1
moje proste polecenie dla wszystkich użytkowników: $ grep precessor / proc / cpuinfo | wc -l
— สมหวัง แนวหน้า

6
Twój obraz tekstu nie jest zbyt pomocny . Nie można go skopiować do edytora i nie indeksuje się zbyt dobrze, co oznacza, że ​​inni użytkownicy z tym samym problemem mają mniejsze szanse na znalezienie odpowiedzi tutaj. Proszę edytować swój post do włączenia odpowiedniego tekstu bezpośrednio (najlepiej przy użyciu kopii + wklej aby uniknąć błędów transkrypcji).
— Toby Speight,

Odpowiedzi:


117

Musisz spojrzeć na gniazda i rdzenie na gniazdo. W tym przypadku masz 1 fizyczny procesor (gniazdo), który ma 4 rdzenie (rdzenie na gniazdo).


1
Mam jedno gniazdo, dwa procesory na gniazdo, więc oznaczałoby to w sumie 2. Jednak mówi 4 procesory. Jeśli spróbuję nproc, odzyskam 4. Używając cat /proc/cpuinfootrzymuję 4, a zatem wydaje się, że ta odpowiedź jest zła, przynajmniej w mojej sytuacji.
— SPRBRN

14
Nie, jeśli masz hiperwątkowość. Nadal masz 2 rdzenie fizyczne, ale każdy z nich pokazuje się dwukrotnie w / proc / cpuinfo. Jeśli przyjrzysz się uważnie pod Coreid, zobaczysz, że każdy Coreid jest wymieniony dwa razy. Również pod flagami widać flagę ht.
— user1403360

237

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 = liczba wątków na rdzeń X rdzeni na gniazdo X gniazda

Procesory są tym, co widać po uruchomieniu htop(nie są równe procesorom fizycznym).

Oto przykład z komputera stacjonarnego:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                8
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1

I serwer:

$ lscpu | grep -E '^Thread|^Core|^Socket|^CPU\('
CPU(s):                32
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2

Wyjście nprocodpowiada liczbie procesorów od lscpu. W przypadku komputera stacjonarnego powyżej powinno to być 8 procesorów zgłoszonych przez lscpu:

$ nproc --all
8

Dane wyjściowe /proc/cpuinfopowinny 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):

$ grep -E 'processor|core id' /proc/cpuinfo
processor   : 0
core id     : 0
processor   : 1
core id     : 0
processor   : 2
core id     : 1
processor   : 3
core id     : 1
processor   : 4
core id     : 2
processor   : 5
core id     : 2
processor   : 6
core id     : 3
processor   : 7
core id     : 3

cpu coresDonosi /proc/cpuinfoodpowiada Core(s) per socketdonosi lscpu. W przypadku komputera stacjonarnego powyżej powinno to odpowiadać 4 rdzeniom na gniazdo zgłoszonym przez lscpu:

$ grep -m 1 'cpu cores' /proc/cpuinfo
cpu cores   : 4

Aby dokładnie odpowiedzieć na twoje pytanie, powiedz, ile masz rdzeni, mnożąc liczbę rdzeni na gniazdo przez liczbę gniazd.

Rdzenie = Rdzenie na gniazdo X Gniazda

Na przykładowe systemy powyżej pulpitu mają 4 rdzenie:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 4

Podczas gdy serwer ma 16:

$ echo "Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))"
Cores = 16

Innym przydatnym narzędziem jest to, dmidecodektó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:

$ sudo dmidecode -t 4 | grep -E 'Socket Designation|Count'
    Socket Designation: CPU1
    Core Count: 8
    Thread Count: 16
    Socket Designation: CPU2
    Core Count: 8
    Thread Count: 16

lscpuKomenda posiada wiele przydatnych opcji, które może chcesz sprawdzić, na przykład:

$ lscpu --all --extended
$ lscpu --all --parse=CPU,SOCKET,CORE | grep -v '^#'

Zobacz man lscpuszczegóły.

W podsumowaniu:

  • Musisz być świadomy gniazd, rdzeni i gwintów
  • Musisz być ostrożnym z terminem „CPU”, ponieważ oznacza różne rzeczy w różnych kontekstach

12
To powinna być zaakceptowana odpowiedź
— gansub,

2
Zgadzam się. To powinna być zaakceptowana odpowiedź, ponieważ lepiej wyjaśnia temat.
— Rafael

Myślę, że dodanie lscpu --all --extendedbyłoby przydatnym dodatkiem, ale nie mam już dostępu do tych konkretnych maszyn.
— htaccess

Możesz także uniknąć awk i wyraźnego pomnożenia:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
— Jakub Klinkovský

@Jakub Klinkovský, dziękuję za zwrócenie na to uwagi, ale w tym przypadku chcę faktycznie wykazać pomnożenie Socket(s) * Core(s) per socket. Biorąc pod uwagę to, co właśnie powiedziałem, myślę, że echo 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 ...
— htaccess

61

Możesz uzyskać te informacje za pomocą nproc(1)polecenia

$ nproc --all
12

Nie wymaga uprawnień roota.


10
Jest to niepoprawne, wyjście nproc odpowiada liczbie procesorów z lscpu. Jeśli masz rdzenie wielowątkowe, wynik programu nproc nie będzie odpowiadał liczbie posiadanych rdzeni.
— htaccess

2
W przypadku rozwiązania innego niż root hack polegałby na użyciu top i hit 1. Wyświetli to liczbę dostępnych rdzeni. Dlaczego widziałem „dostępny”, ponieważ podstawowy sprzęt może mieć więcej rdzeni, takich jak chmura infra.
— Hopping Bunny

@htaccess Przynajmniej na Ubuntu, wyświetla to odpowiednią liczbę logicznych procesorów on-line
— Wil

1
@htaccess ok, rozumiem. Zwykle, gdy duffer linuksa pyta, ile rdzeni oznacza, ile logicznych wątków jest dostępnych. Technicznie rzecz biorąc, Linux nie może nazywać wątków sprzętowych „cpus”. Twoje urządzenie ma 1 procesor z 2 rdzeniami i 4 wątkami sprzętowymi SMT. Rezultatem jest ogromna dwuznaczność tego, co oznaczają procesory i rdzenie. Ale rozumiem, co miałeś na myśli, ty.
— Wil

1
@ Cóż, wzywam to w powyższej odpowiedzi: „Musisz uważać na termin CPU, ponieważ oznacza on różne rzeczy w różnych kontekstach”. Osobiście nie utożsamiam „rdzeni” z logicznymi jednostkami przetwarzającymi, ale z fizycznymi rdzeniami w procesorze (tj. Fizycznymi jednostkami przetwarzającymi).
— htaccess

19

Aby odpowiedź nie była myląca, musisz zrozumieć kilka prostych koncepcji architektury komputerowej:

  • Uruchamiasz procesy („programy”) w systemie Linux. Każdy proces składa się z jednego lub więcej wątków
  • Każdy wątek to osobna sekwencja instrukcji . Dwa wątki mogą być wykonywane równolegle.
  • Każda instrukcja jest przekazywana do procesora, który ma zostać wykonany. Procesor ma logikę, która objaśnia znaczenie bitów instrukcji i decyduje, co z nią zrobić.
  • 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.

    • Pomysł: wątek A obecnie wykonuje arytmetykę, podczas gdy wątek B ładuje coś z pamięci. Gdy jest to prawda, wątki A i B mogą efektywnie współdzielić jeden rdzeń bez wchodzenia sobie w drogę (A używa ALU, B używa jednostki pamięci). Oczywiście czasami oba programy będą chciały ALU, a następnie będą musiały na siebie czekać ...
  • 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:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • jedno fizyczne gniazdo, które zawiera układ z
  • 4 rdzenie fizyczne (łącznie 4 ALU i 4 jednostki pamięci)
  • Tylko 1 wątek może wydawać instrukcje do rdzenia (bez hipertekstu), co oznacza, że ​​jest
  • jeden procesor na rdzeń lub 4 * 1 = 4 procesory

Inny przykład:

CPU(s):                16
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             2

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.


14

Możesz także użyć polecenia, cat /proc/cpuinfoktóre wyświetli porcję danych dla każdego rdzenia. Każda porcja zaczyna się od tych informacji:

processor   : 3
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz
(...)

Rdzenie są numerowane od 0, więc jeśli ostatnia porcja mówi processor : 3tak jak w tym przypadku, twoja maszyna ma 4 rdzenie.


Dzięki temu poleceniu szczegółowo opisuję informacje. :)
— Pan ASquare

W przypadku polecenia jednowierszowego możesz użyćgrep -c ^processor /proc/cpuinfo
— Wildcard

5
getconf _NPROCESSORS_ONLN

(getconf jest częścią glibc)


1
To nieco inne (i przydatne w przypadku niektórych potrzeb). Jest to liczba procesorów, które są teraz online (tj. Dostępne do uruchamiania procesów). Może być mniejsza niż całkowita liczba procesorów, jeśli jeden lub więcej zostało przełączonych w tryb offline (np. Podczas hibernacji lub podczas dodawania / usuwania procesorów).
— Toby Speight

I getconf _NPROCESSORS_CONFdostaje liczbę skonfigurowanych procesorów. Możesz uzyskać wartość obu tych makr również w kodzie źródłowym C, używając sysconf()funkcji. Wpisz man sysconfwięcej informacji.
— Galaxy

4
[root@xxxxx ~]#  dmidecode -t 4 | egrep -i "Designation|Intel|core|thread"
    Socket Designation: CPU1
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12
    Socket Designation: CPU2
    Manufacturer: Intel
            HTT (Multi-threading)
    Version: Intel(R) Xeon(R) CPU           L5640  @ 2.27GHz
    Core Count: 6
    Core Enabled: 6
    Thread Count: 12

Co t 4robi dmidecode? Jak mnożą się liczby i włączone linie? Czy twój przykład pokazuje 2 rdzenie, 6, 12, 24 lub inną liczbę?
— Xen2050

@ Xen2050 4jest processor, patrz linux.die.net/man/8/dmidecode . Ale używanie 4jako argumentu jest złą praktyką.
— JohnKoch,

bash: dmidecode: command not found
— Cameron Hudson

3
$ grep -c processor /proc/cpuinfo
8

To wszystko czego potrzebujesz. Jest to liczba rdzeni online, niezależnie od tego, czy hiperwątkowanie jest włączone, czy wyłączone.

$ ls -d /sys/devices/system/cpu/cpu* | wc -l
8

Kolejny łatwy sposób.


2
To proste, ale nie jestem pewien, czy jest trafne w stosunku do pytania. Poprosił o liczbę rdzeni: (rdzeni! = Cpus), czy włączony jest hyperthreading. Mój system ma 24 rdzenie: 48 cpus przy hiperwątkowości. Również użycie drugiego dostarczonego polecenia ls -d /sys/devices/system/cpu/cpu* | wc -lpokazało 49, ponieważ istnieje katalog cpuidlemiędzy cpuNkatalogami.
— Andrew Falanga,

0

Znalazłem w ten sposób:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))

0

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”.


Jeśli to nie jest odpowiedź, dodaj to jako komentarz.
— Mongrel

@Mongrel Chciałem dodać jako komentarz, ale komentowanie wymaga 50 reputacji
— PickBoy

-2

Rodzina procesorów nie ma tu znaczenia.

  • Procesor (y) = gniazda fizyczne
  • Rdzeń na gniazdo - jak mówi
  • więc całkowita liczba rdzeni = procesor (y) * Rdzeń na gniazdo

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.


1
W swoim opisie mylisz procesory z gniazdami.
— jlliagre

1
Jak mówi jlliagre, jest to niepoprawne. Cores = Cores per socket X Socketspatrz opis w mojej odpowiedzi.
— htaccess

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.