Как узнать количество ядер системы в 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?

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

Mr ASquare
источник
1
Моя простая команда для всех пользователей: $ grep precessor / proc / cpuinfo | wc -l
แนวหน้า แนวหน้า
6
Ваше изображение текста не очень полезно . Его нельзя скопировать в редактор, и он не очень хорошо индексируется, а это означает, что другие пользователи с такой же проблемой с меньшей вероятностью найдут здесь ответ. Пожалуйста, отредактируйте свое сообщение, чтобы включить соответствующий текст напрямую (желательно, используя copy + paste, чтобы избежать ошибок транскрипции).
Тоби Спейт

Ответы:

117

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

user1403360
источник
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, поскольку он означает разные вещи в разных контекстах
Htaccess
источник
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 ядра.

dr01
источник
Спасибо этой команде с подробным описанием информации. :)
Mr ASquare
Для однострочной команды вы можете использоватьgrep -c ^processor /proc/cpuinfo
Wildcard
5
getconf _NPROCESSORS_ONLN

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

LR
источник
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
RELI
источник
Что 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

Я нашел этот путь:

echo $((`cat /sys/devices/system/cpu/present | sed 's/0-//'` + 1))
Серж Руссак
источник
0

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

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

PickBoy
источник
Если это не ответ, то добавьте это как комментарий.
Дворняга
@Mongrel Я хотел бы добавить в качестве комментария, но для комментирования требуется 50 репутации
PickBoy
-2

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

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

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

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

Томаш Клим
источник
1
Вы путаете процессор (ы) с сокетом (ами) в вашем описании.
Jlliagre
1
Как говорит Джлиагре, это неправильно. Cores = Cores per socket X Socketsсм. описание в моем ответе.
htaccess
-3

Простой способ выяснить количество процессоров - выполнить команды ниже:

cat /proc/interrupts | egrep -i 'cpu'
Соуса Гаспар
источник
1
Прерывания или cpuinfo?
Джефф Шаллер
И считать с опцией -c?
Джефф Шаллер