Як дізнатися кількість ядер системи в Linux?


231

Я хотів з’ясувати, скільки ядер має моя система, тому я шукав те саме питання в Google. Я отримав такі команди, як lscpuкоманда. Коли я спробував цю команду, це дало мені такий результат:

$ 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

Зокрема, цей результат показує:

  • Процесор (и): 4
  • Ядро в розетці: 4
  • Сім'я процесора: 6

Що з них вказує на ядра системи Linux?

Чи є якась інша команда вказати кількість ядер, чи я припускаю, що це абсолютно неправильно?


1
моя проста команда для всіх користувачів: $ grep precessor / proc / cpuinfo | wc -l
สมหวัง แนวหน้า

6
Ваше зображення тексту не дуже допомагає . Він не може бути скопійований у редактор, і він не індексується дуже добре, це означає, що інші користувачі з такою ж проблемою рідше знайдуть відповідь тут. Будь ласка , змініть свій пост безпосередньо включити відповідний текст (бажано з допомогою копіювання + вставки , щоб уникнути помилок транскрипції).
Toby Speight

Відповіді:


117

Ви повинні дивитися на розетки та сердечники на розетку. У цьому випадку у вас є 1 фізичний процесор (socket), який має 4 ядра (ядра на сокет).


1
У мене є одна розетка, два процесори на сокет, так що це означало б усього 2. Однак, він говорить про 4 cpus. Якщо я спробую, nprocя отримаю 4 назад. Використовуючи, cat /proc/cpuinfoя отримую 4, і тому, здається, ця відповідь є неправильною, принаймні для моєї ситуації.
SPRBRN

14
Не, якщо у вас гіпер-нитка. У вас ще є 2 фізичні ядра, але кожне ядро ​​показується в / proc / cpuinfo двічі. Якщо ви уважно подивитесь на coreid, то побачите, що у вас є кожен coreid, перерахований двічі. Також під прапорами можна побачити ht прапор.
користувач1403360

237

Для отримання повної картини потрібно подивитися кількість ниток на ядро, ядра на розетку та розетки . Якщо ви помножите ці числа, ви отримаєте кількість процесорів у вашій системі.

ЦП = Нитки на ядро ​​X ядер на розетку X розеток

Процесори - це те, що ви бачите під час запуску htop(вони не прирівнюються до фізичних процесорів).

Ось приклад з настільної машини:

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

І сервер:

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

Вихід від nprocвідповідає кількості процесора від lscpu. Для настільних машин вище це повинно відповідати 8 процесорам, про які повідомляє lscpu:

$ nproc --all
8

Вихідні дані /proc/cpuinfoповинні відповідати цій інформації, наприклад, на настільній системі вище ми бачимо, що є 8 процесорів (ЦП) та 4 ядра (основний ідентифікатор 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 coresПовідомив /proc/cpuinfoвідповідає Core(s) per socketповідомленням lscpu. Для настільних машин вище це повинно відповідати 4-х основним (ям) на сокет, повідомлених lscpu:

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

Щоб конкретно відповісти на ваше запитання, ви скажіть, скільки ядер у вас є, помноживши кількість ядер у сокеті на кількість розеток у вас.

Cores = Ядра на розетку X Sockets

Для прикладу системи над робочим столом мають 4 ядра:

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

Поки сервер має 16:

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

Ще одна корисна утиліта - dmidecodeце виведення інформації на розетку. У випадку перерахованої вище серверної системи ми очікуємо, що ми побачимо 8 ядер на сокет і 16 потоків на сокет:

$ 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

lscpuКоманда має ряд корисних опцій , які ви можете , як перевірити, наприклад:

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

Детальніше man lscpuдив.

Підсумовуючи:

  • Потрібно знати про розетки, сердечники та нитки
  • Вам потрібно бути уважним до терміна CPU, оскільки він означає різні речі в різних контекстах

12
Це має бути прийнята відповідь
gansub

2
Я згоден. Це має бути прийнятою відповіддю, оскільки вона краще пояснить тему.
Рафаель

Я думаю, що додавання lscpu --all --extendedбуло б корисним доповненням, але я більше не маю доступу до цих машин.
htaccess

Ви також можете уникнути awk та явного множення:lscpu --all --parse=CORE,SOCKET | grep -Ev "^#" | sort -u | wc -l
Jakub Klinkovský

@Jakub Klinkovský, дякую за те, що наголосив, але в цьому випадку я хочу насправді продемонструвати множення Socket(s) * Core(s) per socket. З огляду на те, що я щойно сказав, я думаю, echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))що буде краще, щоб люди могли бачити, що саме примножують ...
htaccess

61

Ви можете отримати цю інформацію nproc(1)командою

$ nproc --all
12

Він не вимагає привілеїв root.


10
Це невірно, вихід nproc відповідає кількості CPU від lscpu. Якщо у вас є багатопотокові ядра, то вихід nproc не буде відповідати кількості наявних у вас ядер.
htaccess

2
Для некорінного рішення хак буде використовувати top та hit 1. Це покаже кількість доступних ядер. Чому я бачив "доступний", це тому, що в базовому апаратному забезпеченні може бути більше ядер, як хмара.
Скакаючий Зайчик

@htaccess Принаймні на Ubuntu, це виводить правильну кількість он-лайн логічних процесорів
Wil

1
@htaccess ОК, я розумію. Зазвичай, коли ліфтер Linux запитує, скільки ядер вони означають, скільки логічних ниток доступно. Технічно кажучи, Linux неправильно називати апаратні потоки 'cpus'. У вашій машині є 1 процесор з 2 ядрами та 4 апаратні потоки SMT. Існує величезна кількість неоднозначностей у тому, що означають процесори та ядра в результаті. Але я розумію, що ти мав на увазі зараз, ти.
Віл

1
@ Якщо я закликаю це у своїй відповіді вище: "Вам потрібно бути уважним до терміна CPU, оскільки це означає різні речі в різних контекстах". Особисто я не прирівнюю "ядра" до логічних процесорних одиниць, а до фізичних ядер процесора (тобто фізичних одиниць обробки).
htaccess

19

Щоб відповідь не була заплутаною, вам потрібно зрозуміти пару простих концепцій архітектури комп'ютера:

  • Ви запускаєте процеси ("програми") у своїй Linux-системі. Кожен процес складається з однієї або декількох ниток
  • Кожна нитка - це окрема послідовність інструкцій . Дві нитки можна виконати паралельно.
  • Кожна інструкція задається процесору для виконання. ЦП має логіку, яка визначає, що означають біти інструкції, і вирішує, що з нею робити.
  • Існують різні типи інструкцій. Логіка прийняття рішення всередині процесора буде розсилати різні інструкції до різних апаратних підрозділів . Наприклад, арифметичні інструкції фактично виконуються АЛУ (арифметична / логічна одиниця), тоді як інструкції, які завантажують / зберігають із пам'яті, виконуються якимось модулем пам'яті .

  • Ядро відноситься до набору фактичного апаратного виконання (тобто кожне ядро має АЛУ, блок пам'яті, і т.д ...)

  • Ви можете мати декілька процесорів, які розділяють одне ядро ​​- це називається гіпертонуванням.

    • Ідея: нитка A зараз виконує арифметику, тоді як потік B завантажує щось із пам'яті. Коли це правда, потоки A і B можуть ефективно спільно використовувати одне ядро, не потрапляючи один на одного (A використовує ALU, B використовує блок пам'яті). Звичайно, іноді обидві програми захочуть АЛУ, і тоді їм доведеться чекати один одного ...
  • Сокет є фізичний слот на материнській платі , в яку вставляється чіп. Цей чіп має на ньому певну кількість ядер.

Приклади:

Приклад ОП:

CPU(s):                4
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
  • одна фізична розетка, яка містить чіп
  • 4 фізичних ядра (думаю, 4 АЛУ та 4 одиниці пам’яті)
  • Лише 1 нитка може видавати інструкції до ядра (немає гіперточок), а значить, є
  • один процесор на ядро, або 4 * 1 = 4 процесора

Ще один приклад:

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

Дві фізичні розетки, кожна з яких містить мікросхему з 4 фізичними ядрами, що становить 8 ядер. Дві нитки отримують інструкції до кожного ядра (ця машина має гіперточку), тобто до кожного ядра повинні бути приєднані два процесори, що становить 8 * 2 = 16 процесорів

Перша машина може виконати точно чотири вказівки в будь-який момент часу. Друга машина може виконувати між 8 і 16 інструкціями в будь-який момент часу: 16 буде досягнуто лише тоді, коли кожна пара процесорів виконує різні типи інструкцій і таким чином може спільно використовувати ядро, не чекаючи.


14

Ви також можете скористатися командою, cat /proc/cpuinfoяка виведе фрагмент даних для кожного ядра. Кожен фрагмент починається з цієї інформації:

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

Ядра нумеруються починаючи з 0, тому якщо останній фрагмент говорить, processor : 3як у цьому випадку, у вашої машини є 4 ядра.


Дякую цій команді, докладно описуючи інформацію. :)
Містер ASquare

Для команди з одним лайнером ви можете скористатисяgrep -c ^processor /proc/cpuinfo
Wildcard

5
getconf _NPROCESSORS_ONLN

(getconf входить до складу glibc)


1
Це дещо інакше (і корисно для деяких потреб). Це кількість процесорів, які зараз у мережі (тобто доступні для запущених процесів). Вона може бути меншою, ніж загальна кількість процесорів, якщо один або більше були зняті в режимі офлайн (наприклад, під час сплячки або під час додавання / видалення процесорів).
Toby Speight

І getconf _NPROCESSORS_CONFотримує кількість налаштованих процесорів. Також можна отримати значення обох цих макросів всередині вихідного коду С, використовуючи sysconf()функцію. Введіть man sysconfдодаткову інформацію.
Галактика

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

Що t 4робити з dmidecode? Як розмножуються лічильники та включені рядки? Чи показує ваш приклад 2 ядра, або 6, або 12, або 24, або якесь інше число?
Xen2050

@ Xen2050 4є processor, див. Linux.die.net/man/8/dmidecode . Але використовувати 4як аргумент - це погана практика.
JohnKoch

bash: dmidecode: command not found
Камерон Хадсон

3
$ grep -c processor /proc/cpuinfo
8

Це все, що вам потрібно. Це кількість основних ядер в Інтернеті, незалежно від того, включена чи вимкнена гіперточка.

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

Ще один простий спосіб.


2
Це просто, але я не впевнений, що це питання точно. Він запитав кількість ядер: (ядра! = Cpus), якщо включена гіпертокування. Моя система має 24 ядра: 48 cpus при гіперпотоці. Крім того, за допомогою другої наданої команди ls -d /sys/devices/system/cpu/cpu* | wc -lпоказано 49, оскільки cpuidleсеред cpuNкаталогів є каталог.
Андрій Фаланга


0

Просто хочу додати трохи інформації у відповідь @htaccess.

У CentOS 6.x, dmidecode не виводить інформацію про кількість Core / Thread, і він фактично розглядає "CPU" як "CPU" або "Core" в lscpu, а не "socket".


Якщо це не відповідь, додайте це як коментар.
Монгрель

@Mongrel Я хотів додати як коментар, але для коментування потрібно 50 репутацій
PickBoy

-2

Родина процесора тут не має значення.

  • ЦП = фізичні розетки
  • Ядро (-и) на сокет - як мовиться
  • тому загальна кількість ядер = CPU (s) * Core (s) на сокет

У вашому випадку у вас всього 4 повних ядра.

Що також може бути важливим, це "Нитка (и) на ядро". Але у вас є 1, так що не у вашому випадку.


1
Ви плутаєте процесор (и) з Socket (ами) у своєму описі.
jlliagre

1
Як говорить jlliagre, це неправильно. Cores = Cores per socket X Sockets, дивіться опис у моїй відповіді.
htaccess

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.