
Я немного запутался в количестве процессоров на моем сервере.
Он работает на Intel(R) Xeon(R) Gold 6242R CPU @ 3.10GHz
котором согласноофициальные документы Intelсодержит 20 физических ядер.
Проблема здесь заключается в выводе lscpu
команды (некоторые строки отфильтрованы):
CPU(s): 80
On-line CPU(s) list: 0-79
Thread(s) per core: 2
Core(s) per socket: 20
Socket(s): 2
NUMA node(s): 2
Model name: Intel(R) Xeon(R) Gold 6242R CPU @ 3.10GHz
NUMA node0 CPU(s): 0-19,40-59
NUMA node1 CPU(s): 20-39,60-79
Насколько я понимаю actual physical cores = CPU(s) / thread(s) per core
, я получаю 40, что вдвое больше, чем я ожидал.
Может ли кто-нибудь объяснить мне, что здесь происходит и что именно это CPU(s), thread(s) per core, core(s) per socket, socet(s)
означает?
решение1
Sockets
показывает, сколько физических процессоров находится в системе.Cores per socket
сколько полных ядер ЦП (включая логику загрузки/декодирования) приходится на один физический ЦП.Threads per core
сколько потоков может быть запланировано на одном ядре (HyperThreading). Проще говоря, оборудование в ЦП, которое используетсядофактическое выполнение кода удваивается, что позволяет ЦП иметь несколько различных задач, готовых к выполнению. Это позволяет ЦП извлекать/декодировать инструкции до того, как они попадут в исполняющее ядро ЦП. Это предотвращает или уменьшаетзатор на трубопроводе.CPU
означает «планируемые сущности», это то, сколько очередей выполнения будет у операционной системы, так что это будетsockets x cores per socket x threads per core
В вашем случае у вас есть 2 физических процессора, каждый из которых имеет 20 ядер, каждый из которых может запускать 2 потока (гиперпоточность). Итак 2x20x2 = 80
, какое число CPUs
отображается.
решение2
Путаница возникает из-за очень простой детали, которая может быть неясна из информации, которую lscpu
вам показывает команда.
Дело в том, что на вашем сервере на самом деле их 2 Intel(R) Xeon(R) Gold 6242R CPU
, что и указано в Socket(s)
строке.
Как указано в документации Intel, каждый из этих процессоров содержит 20 физических ядер ( Core(s) per socket
линия), что в общей сложности дает 40 физических ядер.
Каждое из этих ядер способно запускать 2 потока «одновременно» (линия Thread(s) per core
).
Итак: 2 Intel Xeon, по 20 физических ядер каждый, по 2 потока на каждое ядро, дают в общей сложности 80 «единиц, которые могут выполнять процесс» или «ЦП».
решение3
Идея ЦП сейчас немного абстрагирована, и это началось с гиперпоточности (конец 90-х), а затем с серии Intel Core (начало 00-х). До этого у вас определенно были многопроцессорные системы, но все они были многопроцессорными физическими.
Однако при использовании гиперпоточности и многоядерных отдельных ЦП физическое количество ЦП отличается от логического количества ЦП, которое видит работающий на ЦП код.
Socket(s): 2
У вас есть 2 физических процессора, как в «штуке с радиатором, подключенной к вашей материнской плате»
Core(s) per socket: 20
Каждый физический ЦП имеет 20 ядер, которые выглядят и в основном работают как независимые ЦП для Linux. Ядра используют как минимум один и тот же кэш L3, вероятно, кэш L2 и, вероятно, имеют свой собственный кэш L1 — так что они не так производительны, как отдельные сокеты с собственными L3/L2/L1, но почти так же.
Поскольку это каждое гнездо, у вас есть 2 * 20 = 40.
Thread(s) per core: 2
Каждое ядро имеет 2 потока SMT, которые реализованы микроархитектурой вашего ЦП, чтобы в целом выглядеть как независимые ЦП для Linux.
Они не будут такими быстрыми, как настоящие независимые ядра.
Потоки на микроархитектуре пытаются захватить неиспользуемые в данный момент этапы конвейера из ядер, но, если они заняты, им, возможно, придется ждать, а процессоры и так стараются быть очень занятыми, так что, опять же, 2 потока на 2 ядрах далеко не эквивалентны 4 ядрам, но это то, что может немного ускорить выполнение кода.
Обратите внимание, что Spectre и подобные уязвимости гораздо более вероятны между потоками, чем между ядрами или сокетами, поскольку ресурсы ядер являются общими.
В любом случае, поскольку это на ядро, а также на сокет, то это 2 * 20 * 2, что дает вам:
CPU(s): 80
решение4
Ваш сервер использует 2 «процессорных чипа» (на 2 сокетах), каждый из которых имеет 20 физических ядер.
И каждое ядро может обрабатывать 2 потока.
Вот почему он отображает 2 (чипов процессора) * 20 (ядер на часть) * 2 (потока, которое может обрабатывать каждое ядро) = 80 ЦП.
В данном случае ЦП означает «планируемая сущность», т.е. количество потоков, которые может запустить машина.