Как узнать количество ядер системы в 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
  • Core (s) на сокет: 4
  • Семейство процессоров: 6

Что из этого указывает на ядра системы Linux?

Есть ли какая-либо другая команда, чтобы определить количество ядер, или я предполагаю, что она полностью неверна?


1
Моя простая команда для всех пользователей: $ grep precessor / proc / cpuinfo | wc -l
— แนวหน้า แนวหน้า

6
Ваше изображение текста не очень полезно . Его нельзя скопировать в редактор, и он не очень хорошо индексируется, а это означает, что другие пользователи с такой же проблемой с меньшей вероятностью найдут здесь ответ. Пожалуйста, отредактируйте свое сообщение, чтобы включить соответствующий текст напрямую (желательно, используя copy + paste, чтобы избежать ошибок транскрипции).
— Тоби Спейт

Ответы:


117

Вы должны смотреть на сокеты и ядра на сокет. В этом случае у вас есть 1 физический процессор (сокет), который имеет 4 ядра (ядра на сокет).


1
У меня есть один сокет, два процессора на сокет, так что это будет означать всего 2. Однако, это говорит о 4 процессорах. Если я попробую, nprocя верну 4. Используя cat /proc/cpuinfoя получаю 4, и, таким образом, кажется, что этот ответ является неправильным, по крайней мере, для моей ситуации.
— СПРБРН

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

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

Чтобы конкретно ответить на ваш вопрос, вы говорите, сколько ядер у вас есть, умножая количество ядер на каждый сокет на количество имеющихся у вас сокетов.

Сердечники = сердечники на гнездо X розетки

Для приведенных выше примеров систем настольный компьютер имеет 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ý, спасибо за указание на это, но в этом случае я хочу продемонстрировать умножение Socket(s) * Core(s) per socket. Учитывая то, что я только что сказал, я думаю, echo Cores = $(( $(lscpu | awk '/^Socket\(s\)/{ print $2 }') * $(lscpu | awk '/^Core\(s\) per socket/{ print $4 }') ))было бы лучше, чтобы люди могли точно видеть, что умножается ...
— htaccess

62

Вы можете получить эту информацию по nproc(1)команде

$ nproc --all
12

Не требует прав root.


10
Это неверно, вывод nproc соответствует количеству ЦП из lscpu. Если у вас многопоточные ядра, то вывод nproc не будет соответствовать количеству ядер, которые у вас есть.
— htaccess

2
Для некорневого решения взломать будет использовать top и нажать 1. Это покажет количество доступных ядер. Я понял, что «доступно», потому что базовое оборудование может иметь больше ядер, таких как облачная инфраструктура.
— Прыгающий кролик

@htaccess По крайней мере в Ubuntu это выдает правильное количество оперативных логических процессоров
— Уил

1
@htaccess хорошо, я понял. Обычно, когда linux duffer спрашивает, сколько ядер они имеют в виду, сколько доступно логических потоков. Технически говоря, linux неправильно называть аппаратные потоки «процессорами». Ваша машина имеет 1 процессор с 2 ядрами и 4 SMT аппаратными потоками. Существует огромная неопределенность в том, что означают процессоры и ядра. Но я понимаю, что ты имел в виду сейчас, Тай.
— Виль

1
@ Я даю это в своем ответе выше: «Вы должны быть осторожны с термином ЦП, поскольку он означает разные вещи в разных контекстах». Лично я не приравниваю «ядра» к логическим процессорам, а к физическим ядрам в процессоре (то есть к физическим процессорам).
— htaccess

19

Чтобы ответ не вводил в заблуждение, необходимо понять несколько простых концепций компьютерной архитектуры:

  • Вы запускаете процессы («программы») в вашей системе Linux. Каждый процесс состоит из одного или нескольких потоков
  • Каждый поток представляет собой отдельную последовательность инструкций . Два потока могут выполняться параллельно.
  • Каждая инструкция передается процессору для выполнения. У CPU есть логика, которая вычисляет, что означают биты инструкции, и решает, что с ней делать.
  • Существуют разные типы инструкций. Логика принятия решений внутри ЦП будет отправлять разные инструкции разным аппаратным модулям . Например, арифметические инструкции фактически выполняются ALU (арифметическим / логическим блоком), в то время как инструкции, которые загружаются / сохраняются из памяти, выполняются каким-либо блоком памяти .

  • Под ядром понимается набор реального исполнительного оборудования (т. Е. Каждое ядро ​​имеет ALU, блок памяти и т. Д.)

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

    • Идея: поток 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 ALU и 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 ядра.


Спасибо этой команде с подробным описанием информации. :)
— Mr ASquare

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

5
getconf _NPROCESSORS_ONLN

(getconf является частью glibc)


1
Это немного отличается (и полезно для некоторых нужд). Это количество процессоров, которые в данный момент находятся в сети (то есть доступны для запуска процессов). Может быть меньше, чем общее количество процессоров, если один или несколько из них были отключены (например, во время гибернации или при добавлении / удалении процессоров).
— Тоби Спейт

И getconf _NPROCESSORS_CONFполучает количество сконфигурированных процессоров. Вы также можете получить значение обоих этих макросов внутри исходного кода C, используя sysconf()функцию. Введите man sysconfдля получения дополнительной информации.
— 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

Что t 4делать для dmidecode? Как умножаются счетчики и разрешенные линии? Ваш пример показывает 2 ядра, или 6, или 12, или 24, или какое-то другое число?
— Xen2050

@ Xen2050 4это processor, см linux.die.net/man/8/dmidecode . Но использование в 4качестве аргумента - плохая практика.
— ДжонКоч

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

3
$ grep -c processor /proc/cpuinfo
8

Это все, что вам нужно. Это количество основных онлайн, независимо от того, включена или выключена гиперпоточность.

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

Еще один простой способ.


2
Это просто, но я не уверен, что это точно на вопрос. Он спросил количество ядер: (cores! = Cpus), если включена поддержка Hyperthreading. Моя система имеет 24 ядра: 48 процессоров с гиперпоточностью. Кроме того, использование второй предоставленной команды ls -d /sys/devices/system/cpu/cpu* | wc -lпоказало 49, потому что есть каталог cpuidleсреди cpuNкаталогов.
— Андрей Фаланга


0

Просто хочу добавить информацию к ответу @htaccess.

В CentOS 6.x dmidecode не выводит информацию о количестве ядер / потоков, и он фактически рассматривает «CPU» как «CPU» или «Core» в lscpu, а не «socket».


Если это не ответ, то добавьте это как комментарий.
— Дворняга

@Mongrel Я хотел бы добавить в качестве комментария, но для комментирования требуется 50 репутации
— PickBoy

-2

Семейство процессоров здесь не имеет значения.

  • Процессор (ы) = физические сокеты
  • Core (s) на сокет - как говорится
  • поэтому общее число ядер = процессор (ов) * Ядро (ы) в гнездо

В вашем случае у вас всего 4 полных ядра.

Что также может быть важно, так это «Thread (s) per core»). Но у вас есть 1, так что не в вашем случае.


1
Вы путаете процессор (ы) с сокетом (ами) в вашем описании.
— Jlliagre

1
Как говорит Джлиагре, это неправильно. Cores = Cores per socket X Socketsсм. описание в моем ответе.
— htaccess

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.