Numa: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показаны 82 промежуточные версии этого же участника)
Строка 1: Строка 1:
[[Категория:Numa]]
+
[[Категория:NUMA]]
 
[[Категория:Linux]]
 
[[Категория:Linux]]
 
[[Категория:Hardware]]
 
[[Категория:Hardware]]
 
=Numa=
 
=Numa=
Это заготовка статьи про Numa
+
Это заготовка перевода статьи про Numa
 
<BR>
 
<BR>
 
* https://www.servethehome.com/answered-cpu-dual-processor-motherboard/
 
* https://www.servethehome.com/answered-cpu-dual-processor-motherboard/
  +
с некоторыми моими дополнениями и уточнениями
cat /sys/class/net/enp6s0f0/device/numa_node
 
  +
   
 
=Можно ли использовать один CPU в многопроцессорных системах? (и почему)=
 
=Можно ли использовать один CPU в многопроцессорных системах? (и почему)=
Строка 15: Строка 16:
 
<BR>
 
<BR>
 
Ответ на вопрос - "Да, работать будет", но с некоторыми оговорками.
 
Ответ на вопрос - "Да, работать будет", но с некоторыми оговорками.
  +
=<code>Supermicro X8DTN</code>=
=Пояснение=
 
  +
'''TL; DR:''' Подавляющее большинство материнских плат «просто работают», <BR> если поставить процессор в сокет с наименьшим номером
  +
<BR>
  +
Это справедливо как для материнских плат Intel, так и для AMD в целом, а в случае сомнения информацию можно найти в руководстве (но у меня никогда таких сомнений не было)
   
  +
Вот пример материнской платы Supermicro X8DTN, которая представляла собой довольно двухпроцессорную плату Xeon серий Intel 5500 и 5600.
The vast majority of motherboards “just work” if you install a CPU into the lowest numbered CPU slot.
 
This is usually CPU0 if there is CPU0 and CPU1 or CPU1 if the board is tagged CPU1 and CPU2.
 
This is true for both Intel and AMD motherboards in general and when in doubt, most motherboard manuals
 
will instruct a user as to which processor slot can be populated by a single CPU and a dual CPU motherboard.
 
Here is an example from a Supermicro X8DTN motherboard that was a fairly popular dual processor Intel 5500 and 5600 series Xeon motherboard.
 
 
<BR>
 
<BR>
 
[[Файл:NUMA 1 Supermicro-X8DTN-Block-Diagram.png]]
 
[[Файл:NUMA 1 Supermicro-X8DTN-Block-Diagram.png]]
 
<BR>
 
<BR>
  +
Since the Intel 5500 and 5520 series chipset had an IOH northbridge, populating only one CPU slot in the dual socket motherboard did not cut out any additional motherboard resources. In the Intel socket LGA1366 days, and with the AMD C32 and G34 platforms, both the northbridge and southbridge were found on the motherboard so the CPUs generally connected through the northbridge to get to an expansion card bus. In these systems, the main impact of only having one CPU (other than the obvious loss in CPU performance without the second CPU) is that one could not populate the memory banks for the empty processor slot. This is very similar to the single CPU nodes we use for the STH colocation project, even though each Dell C6100 node is dual processor capable.
 
  +
=Dell C6100=
  +
Поскольку наборы микросхем Intel серий 5500 и 5520 имели северный мост IOH,
  +
установка только одного процессор в двухпроцессорной материнской плате не привела к недоступности каких-то ресурсов материнской платы.
  +
<BR>
  +
<BR>
  +
'''За исключением памяти, так как каждый слот памяти относится к одному из процессоров'''
  +
<BR>
  +
<BR>
  +
Во времена <code>Intel LGA1366</code>, а также на платформах <code>AMD</code> <code>C32</code> и <code>G34</code> и северный, и южный мосты находились на материнской плате,
  +
поэтому процессоры обычно подключались через северный мост, чтобы получить доступ к шине <code>PCI</code>.
  +
<BR>
  +
В качестве примера можно рассмотреть <code>Dell C6100</code> (это такой а-ля блейд, 4 ноды в корпусе 2U с общими резервированными блоками питания но каждый со своими дисками и сетью) <BR>
  +
C установкой одного процессора и заполнением только половины слотов памяти он будет работать как обычная однопроцессорная система
 
<BR>
 
<BR>
 
[[Файл:NUMA 3 STH-colo-pfsense-node-and-Mellanox-IB-node.png]]
 
[[Файл:NUMA 3 STH-colo-pfsense-node-and-Mellanox-IB-node.png]]
  +
<BR>
  +
На фото в примере можно видеть что установлен только один процессор и заполнена только половина слотов DIMM, соответствующих установленному процессору.
 
<BR>
 
<BR>
   
  +
Эта конфигурация значительно отличается от более современных систем тспользующих сокет LGA2011
Underneath those heatsinks on the upper node sits only one processor despite the board being dual-processor capable. One can also see that the associated DRAM bank is filled with DDR3 RDIMMs while the empty socket is utilizing DIMM blanks. This setup is much different than a more modern LGA2011 dual Intel Xeon motherboard. Here is an example of a Supermicro X9DRH-7TF which has both onboard LSI SAS and Intel X540 10GbE:
 
  +
<BR>
  +
В качестве примера более новой конфигурации рассмотрим плату <code>Supermicro X9DRH-7TF</code>у которой есть onboard <code>LSI SAS</code> и стевая карта 10GbE <code>Intel X540</code>.
   
  +
=<code>Supermicro X9DRH-7TF</code>=
 
<BR>
 
<BR>
 
[[Файл:NUMA 0 Supermicro-X9DRH-7TF-Layout.png]]
 
[[Файл:NUMA 0 Supermicro-X9DRH-7TF-Layout.png]]
 
<BR>
 
<BR>
   
  +
Более свежие архитектуры добавляют еще один уровень сложности. <BR>
Today’s architectures add another level of complexity. With the dual Intel Xeon E5 LGA2011 platform as an example, the PCIe expansion slots are directly tied to a CPU. On the picture above, one can see each PCIe slot tied to a specific CPU. When a CPU socket is not populated, the PCIe lanes do not terminate. This has a major impact on the functionality of the motherboard. For example, if the second CPU socket is not filled in a dual socket motherboard oftentimes onboard devices such as Ethernet and SAS controllers may not work. Furthermore, PCIe lanes may not work. This will render the slots useless until the additional CPU(s) are added. Here is an associated diagram for the Supermicro X9DRH-7TF:
 
  +
На примере двухпроцессорной платформы Intel Xeon E5 LGA2011 слоты расширения <code>PCIe</code> напрямую привязаны к процессору.
  +
<BR>
  +
На изображении выше можно увидеть каждый слот <code>PCIe</code>, привязанный к определенному процессору.
  +
<BR>
  +
Когда сокет CPU не заполнен, часть линий <code>PCIe</code> оказываются "подвешенными в воздухе".
  +
<BR>
  +
Это оказывает существенное влияние на функциональность материнской платы.
  +
<BR>
  +
Например, если второй разъем CPU не заполнен на материнской плате с двумя разъемами,
  +
часть устройств встроенных в платк как, например, контроллеры <code>Ethernet</code> и <code>SAS</code>, не будут работать.
  +
<BR>
  +
(Примечание: но это теория, на практике обычно нельзя поставить только второй процессор, а встроенные устройства (соответствующие им линии <code>PCIe</code>) подключены к первому (или нулевому, зависит от нумерации) процессору. )
  +
<BR>
  +
Кроме того, как уже сказано, часть линий <code>PCIe</code> могут будут работать что сделает слоты бесполезными.
  +
<BR>
  +
Вот соответствующая диаграмма для материнской платы<code>Supermicro X9DRH-7TF</code>:
   
 
<BR>
 
<BR>
Строка 42: Строка 76:
 
<BR>
 
<BR>
   
  +
Здесь мы видим, что если бы CPU1 отсутствовал (''гипотетический случай''),
Here we can see that if CPU1 was missing, the onboard Intel X540 10GbE LAN and LSI SAS2208 controller do not have a PCIe but to hang off of. Conversely, with no CPU2, one would not have access to several PCIe 3.0 x8 slots. Luckily, most motherboard manufacturers state in their manuals which socket to populate.
 
  +
то линии <code>PCIe</code> встроенных контроллеров <code>Intel X540 10GbE LAN</code> и <code>LSI SAS2208</code> оказались бы "висящими в воздухе" (никуда не подключены).
  +
  +
<BR>
  +
C другой стороны без CPU2 (это уже более реальный случай) не будет доступа к нескольким слотам <code>PCIe 3.0 x8</code>.
  +
<BR>
  +
К счастью, большинство производителей материнских плат указывают в своих руководствах соответвие между процессорными сокетами и слотами <code>PCIe</code>
  +
  +
=Linux=
  +
  +
Для работы с NUMA в Linux есть некоторое колличество инструментов:
  +
  +
{| class="wikitable" style="width: 100%"
  +
|+ Примеры работы с NUMA
  +
|-
  +
!
  +
Описание ячейки
  +
!
  +
<code>Intel(R) Xeon(R) CPU X5670</code>
  +
<BR>
  +
<code>Socket LGA1366</code>
  +
!
  +
<code>Intel(R) Xeon(R) CPU E5-2620 v2</code>
  +
<BR>
  +
<code>Socket LGA2011</code>
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|style="width: 10%" |
  +
Платформа/Материнская Плата
  +
|style="width: 45%" |
  +
<PRE>
  +
System Information
  +
Manufacturer: HP
  +
Product Name: ProLiant DL180 G6
  +
Version:
  +
Serial Number: CZJ0220BHZ
  +
UUID: 01245e64-8efe-d511-b3f4-d8d385e535ec
  +
Wake-up Type: Power Switch
  +
SKU Number: 470065-095
  +
Family:
  +
</PRE>
  +
|style="width: 100%" |
  +
<PRE>
  +
Base Board Information
  +
Manufacturer: Supermicro
  +
Product Name: X9DRW
  +
</PRE>
  +
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|
  +
Просмотр информации о "железе"<BR>
  +
<code>numactl</code>
  +
|
  +
<code>numactl --hardware</code>
  +
<PRE>
  +
available: 2 nodes (0-1)
  +
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
  +
node 0 size: 96691 MB
  +
node 0 free: 58301 MB
  +
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
  +
node 1 size: 96728 MB
  +
node 1 free: 66809 MB
  +
node distances:
  +
node 0 1
  +
0: 10 20
  +
1: 20 10
  +
</PRE>
  +
|
  +
<code>
  +
numactl --hardware
  +
</code>
  +
<PRE>
  +
available: 2 nodes (0-1)
  +
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
  +
node 0 size: 32154 MB
  +
node 0 free: 31402 MB
  +
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
  +
node 1 size: 32204 MB
  +
node 1 free: 31733 MB
  +
node distances:
  +
node 0 1
  +
0: 10 21
  +
1: 21 10
  +
</PRE>
  +
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|
  +
Просмотр статистики использования:<BR>
  +
<code>/sys/devices/system/node/node0/numastat</code><BR>
  +
<code>/sys/devices/system/node/node1/numastat</code><BR>
  +
<code>numastat</code><BR>
  +
'''Важное замечание:''' эта статистика отражает аллокцию
  +
страниц, но не обращения к ним, по-тому возможна ситуация
  +
когда идет обращение к чужим страницам и оно не попадает в эту статистику
  +
||
  +
<PRE>
  +
numastat
  +
node0 node1
  +
numa_hit 52314463 58897099
  +
numa_miss 0 0
  +
numa_foreign 0 0
  +
interleave_hit 28279 28251
  +
local_node 52312978 58861619
  +
other_node 1485 35480
  +
</PRE>
  +
||
  +
<PRE>
  +
numastat
  +
node0 node1
  +
numa_hit 945918 557506
  +
numa_miss 0 0
  +
numa_foreign 0 0
  +
interleave_hit 16862 16657
  +
local_node 944697 538529
  +
other_node 1221 18977
  +
</PRE>
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|
  +
<code>lstopo</code>
  +
<BR>
  +
В выводе команды можно видеть что в случае более старой платформы устройства <code>PCIe</code>
  +
не выделенны к какой то отдельной NUMA-ноде, в отличии от более новой платформы
  +
<BR>
  +
'''TODO: добавить сетевую карту во второй слот для проверки'''
  +
<BR>
  +
Топология платы приведена на картинке под таблицей
  +
|
  +
<code>
  +
lstopo
  +
</code>
  +
<PRE>
  +
Machine (189GB total)
  +
Package L#0
  +
NUMANode L#0 (P#0 94GB)
  +
L3 L#0 (12MB)
  +
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
  +
PU L#0 (P#0)
  +
PU L#1 (P#12)
  +
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
  +
PU L#2 (P#1)
  +
PU L#3 (P#13)
  +
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
  +
PU L#4 (P#2)
  +
PU L#5 (P#14)
  +
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
  +
PU L#6 (P#3)
  +
PU L#7 (P#15)
  +
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
  +
PU L#8 (P#4)
  +
PU L#9 (P#16)
  +
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
  +
PU L#10 (P#5)
  +
PU L#11 (P#17)
  +
Package L#1
  +
NUMANode L#1 (P#1 94GB)
  +
L3 L#1 (12MB)
  +
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
  +
PU L#12 (P#6)
  +
PU L#13 (P#18)
  +
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
  +
PU L#14 (P#7)
  +
PU L#15 (P#19)
  +
L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
  +
PU L#16 (P#8)
  +
PU L#17 (P#20)
  +
L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
  +
PU L#18 (P#9)
  +
PU L#19 (P#21)
  +
L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
  +
PU L#20 (P#10)
  +
PU L#21 (P#22)
  +
L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
  +
PU L#22 (P#11)
  +
PU L#23 (P#23)
  +
HostBridge
  +
PCIBridge
  +
PCI 0a:00.0 (Ethernet)
  +
Net "enp10s0f0"
  +
PCI 0a:00.1 (Ethernet)
  +
Net "enp10s0f1"
  +
PCIBridge
  +
PCI 09:00.0 (RAID)
  +
Block(Disk) "sdf"
  +
Block(Disk) "sdd"
  +
Block(Disk) "sdb"
  +
Block(Disk) "sdg"
  +
Block(Disk) "sde"
  +
Block(Disk) "sdc"
  +
Block(Disk) "sda"
  +
Block(Disk) "sdh"
  +
PCIBridge
  +
PCIBridge
  +
PCIBridge
  +
PCI 08:00.0 (Ethernet)
  +
Net "enp8s0f0"
  +
PCI 08:00.1 (Ethernet)
  +
Net "enp8s0f1"
  +
PCIBridge
  +
PCI 07:00.0 (Ethernet)
  +
Net "enp7s0f0"
  +
PCI 07:00.1 (Ethernet)
  +
Net "enp7s0f1"
  +
PCIBridge
  +
PCI 04:00.0 (Storage)
  +
PCIBridge
  +
PCI 02:00.0 (VGA)
  +
PCI 00:1f.2 (SATA)
  +
Block(Disk) "sdi"
  +
</PRE>
  +
|
  +
<code>
  +
lstopo
  +
</code>
  +
<PRE>
  +
lstopo
  +
Machine (63GB total)
  +
Package L#0
  +
NUMANode L#0 (P#0 31GB)
  +
L3 L#0 (15MB)
  +
L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
  +
PU L#0 (P#0)
  +
PU L#1 (P#12)
  +
L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
  +
PU L#2 (P#1)
  +
PU L#3 (P#13)
  +
L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
  +
PU L#4 (P#2)
  +
PU L#5 (P#14)
  +
L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
  +
PU L#6 (P#3)
  +
PU L#7 (P#15)
  +
L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
  +
PU L#8 (P#4)
  +
PU L#9 (P#16)
  +
L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
  +
PU L#10 (P#5)
  +
PU L#11 (P#17)
  +
HostBridge
  +
PCIBridge
  +
PCI 02:00.0 (Ethernet)
  +
Net "eno1"
  +
PCI 02:00.1 (Ethernet)
  +
Net "eno2"
  +
PCIBridge
  +
PCI 04:00.0 (Ethernet)
  +
Net "enp4s0f0"
  +
PCI 04:00.1 (Ethernet)
  +
Net "enp4s0f1"
  +
PCIBridge
  +
PCI 07:00.0 (SAS)
  +
PCIBridge
  +
PCIBridge
  +
PCIBridge
  +
PCIBridge
  +
PCI 0c:00.0 (VGA)
  +
PCI 00:1f.2 (SATA)
  +
Block(Disk) "sdd"
  +
Block(Disk) "sdb"
  +
Block(Disk) "sdc"
  +
Block(Disk) "sda"
  +
Package L#1
  +
NUMANode L#1 (P#1 31GB)
  +
L3 L#1 (15MB)
  +
L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
  +
PU L#12 (P#6)
  +
PU L#13 (P#18)
  +
L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
  +
PU L#14 (P#7)
  +
PU L#15 (P#19)
  +
L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
  +
PU L#16 (P#8)
  +
PU L#17 (P#20)
  +
L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
  +
PU L#18 (P#9)
  +
PU L#19 (P#21)
  +
L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
  +
PU L#20 (P#10)
  +
PU L#21 (P#22)
  +
L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
  +
PU L#22 (P#11)
  +
PU L#23 (P#23)
  +
</PRE>
  +
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|colspan="3"|
  +
Получить список устройств принадллежащих определенной NUMA-ноде можно примерно таким скриптом
  +
<BR>
  +
В примере - поиск всех устройст не относящихся к Node 0 (<code>[ "${NUMA_NODE}" -ne "0" ]</code>)
  +
<BR>
  +
<BR>
  +
<code>
  +
for DEV in $(find /sys/* -wholename "*/numa_node" ); do NUMA_NODE=$(cat ${DEV}); if [ "${NUMA_NODE}" -ne "0" ]; then PCI_ID=$(echo ${DEV}| awk -F '/' '{ print $(NF-1) }' | awk -F':' '{ print $2":"$3}'); DEVICE_NAME=$(lspci | grep -F "${PCI_ID}"); echo "NUMA_NODE=${NUMA_NODE} ${DEVICE_NAME} ${DEV} ${PCI_ID}"; fi; done
  +
</code>
  +
<BR>
  +
<BR>
  +
<BR>
  +
В выводе ниже можно видеть что для PCI устройств на более старой платформе NUMA-нода не определена (<code>-1</code>)<BR>
  +
в то время как на новой платформе часть устройств относится к NUMA-ноде 1<BR>
  +
  +
  +
|- style="vertical-align:top;"
  +
|colspan="3"|
  +
  +
Пример вывода (частично) <code>Intel(R) Xeon(R) CPU X5670</code> <code>Socket LGA1366</code>
  +
  +
<PRE>
  +
NUMA_NODE=-1 0a:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) /sys/devices/pci0000:00/0000:00:01.0/0000:0a:00.0/numa_node 0a:00.0
  +
NUMA_NODE=-1 0a:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) /sys/devices/pci0000:00/0000:00:01.0/0000:0a:00.1/numa_node 0a:00.1
  +
NUMA_NODE=-1 07:00.0 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:04.0/0000:07:00.0/numa_node 07:00.0
  +
NUMA_NODE=-1 07:00.1 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:04.0/0000:07:00.1/numa_node 07:00.1
  +
NUMA_NODE=-1 08:00.0 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:02.0/0000:08:00.0/numa_node 08:00.0
  +
NUMA_NODE=-1 08:00.1 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:02.0/0000:08:00.1/numa_node 08:00.1
  +
</PRE>
  +
  +
|- style="vertical-align:top;"
  +
|colspan="3"|
  +
  +
Пример вывода (частично) Для
  +
<code>Intel(R) Xeon(R) CPU E5-2620 v2</code> <code>Socket LGA2011</code>
  +
  +
<PRE>
  +
NUMA_NODE=1 ff:13.4 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Registers (rev 04) /sys/devices/pci0000:ff/0000:ff:13.4/numa_node ff:13.4
  +
NUMA_NODE=1 ff:10.2 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 ERROR Registers 0 (rev 04) /sys/devices/pci0000:ff/0000:ff:10.2/numa_node ff:10.2
  +
NUMA_NODE=1 ff:08.0 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 0 (rev 04) /sys/devices/pci0000:ff/0000:ff:08.0/numa_node ff:08.0
  +
NUMA_NODE=1 ff:0d.0 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers (rev 04) /sys/devices/pci0000:ff/0000:ff:0d.0/numa_node ff:0d.0
  +
</PRE>
  +
  +
  +
|+ Примеры работы с NUMA
  +
|-
  +
!
  +
Описание ячейки
  +
!
  +
<code>Intel(R) Xeon(R) CPU X5670</code>
  +
<BR>
  +
<code>Socket LGA1366</code>
  +
!
  +
<code>Intel(R) Xeon(R) CPU E5-2620 v2</code>
  +
<BR>
  +
<code>Socket LGA2011</code>
  +
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|
  +
Проверка для сетевых карт
  +
|
  +
Не привязана к NUMA-ноде
  +
<PRE>
  +
cat /sys/class/net/enp10s0f1/device/numa_node
  +
-1
  +
</PRE>
  +
|
  +
Привязана к NUMA-ноде (c номером 0)
  +
<PRE>
  +
cat /sys/class/net/enp4s0f0/device/numa_node
  +
0
  +
</PRE>
  +
  +
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
  +
|
  +
To Be Added
  +
|
  +
To Be Added
  +
|
  +
To Be Added
  +
  +
|}
  +
  +
  +
==<code>X9DRW-3LN4F+/3TF+</code>==
  +
[[Файл:NUMA 5 X9DRW-3LN4F.png|600px]]
  +
  +
=Ссылки=
  +
* https://habr.com/ru/companies/intel/articles/171079/
  +
* https://habr.com/ru/companies/intel/articles/171079/

Текущая версия на 13:39, 4 апреля 2024

Numa

Это заготовка перевода статьи про Numa

с некоторыми моими дополнениями и уточнениями


Можно ли использовать один CPU в многопроцессорных системах? (и почему)

Почему возникает такой вопрос?
По-тому что системы с 2 и более сокетами на материнской плате допускают возможное расширение без полной замены сервера
Ответ на вопрос - "Да, работать будет", но с некоторыми оговорками.

Supermicro X8DTN

TL; DR: Подавляющее большинство материнских плат «просто работают»,
если поставить процессор в сокет с наименьшим номером
Это справедливо как для материнских плат Intel, так и для AMD в целом, а в случае сомнения информацию можно найти в руководстве (но у меня никогда таких сомнений не было)

Вот пример материнской платы Supermicro X8DTN, которая представляла собой довольно двухпроцессорную плату Xeon серий Intel 5500 и 5600.
NUMA 1 Supermicro-X8DTN-Block-Diagram.png

Dell C6100

Поскольку наборы микросхем Intel серий 5500 и 5520 имели северный мост IOH, установка только одного процессор в двухпроцессорной материнской плате не привела к недоступности каких-то ресурсов материнской платы.

За исключением памяти, так как каждый слот памяти относится к одному из процессоров

Во времена Intel LGA1366, а также на платформах AMD C32 и G34 и северный, и южный мосты находились на материнской плате, поэтому процессоры обычно подключались через северный мост, чтобы получить доступ к шине PCI.
В качестве примера можно рассмотреть Dell C6100 (это такой а-ля блейд, 4 ноды в корпусе 2U с общими резервированными блоками питания но каждый со своими дисками и сетью)
C установкой одного процессора и заполнением только половины слотов памяти он будет работать как обычная однопроцессорная система
NUMA 3 STH-colo-pfsense-node-and-Mellanox-IB-node.png
На фото в примере можно видеть что установлен только один процессор и заполнена только половина слотов DIMM, соответствующих установленному процессору.

Эта конфигурация значительно отличается от более современных систем тспользующих сокет LGA2011
В качестве примера более новой конфигурации рассмотрим плату Supermicro X9DRH-7TFу которой есть onboard LSI SAS и стевая карта 10GbE Intel X540.

Supermicro X9DRH-7TF


NUMA 0 Supermicro-X9DRH-7TF-Layout.png

Более свежие архитектуры добавляют еще один уровень сложности.
На примере двухпроцессорной платформы Intel Xeon E5 LGA2011 слоты расширения PCIe напрямую привязаны к процессору.
На изображении выше можно увидеть каждый слот PCIe, привязанный к определенному процессору.
Когда сокет CPU не заполнен, часть линий PCIe оказываются "подвешенными в воздухе".
Это оказывает существенное влияние на функциональность материнской платы.
Например, если второй разъем CPU не заполнен на материнской плате с двумя разъемами, часть устройств встроенных в платк как, например, контроллеры Ethernet и SAS, не будут работать.
(Примечание: но это теория, на практике обычно нельзя поставить только второй процессор, а встроенные устройства (соответствующие им линии PCIe) подключены к первому (или нулевому, зависит от нумерации) процессору. )
Кроме того, как уже сказано, часть линий PCIe могут будут работать что сделает слоты бесполезными.
Вот соответствующая диаграмма для материнской платыSupermicro X9DRH-7TF:


NUMA 4 Supermicro-X9DRH-7TF-Block-Diagram.png

Здесь мы видим, что если бы CPU1 отсутствовал (гипотетический случай), то линии PCIe встроенных контроллеров Intel X540 10GbE LAN и LSI SAS2208 оказались бы "висящими в воздухе" (никуда не подключены).


C другой стороны без CPU2 (это уже более реальный случай) не будет доступа к нескольким слотам PCIe 3.0 x8.
К счастью, большинство производителей материнских плат указывают в своих руководствах соответвие между процессорными сокетами и слотами PCIe

Linux

Для работы с NUMA в Linux есть некоторое колличество инструментов:

Примеры работы с NUMA

Описание ячейки

Intel(R) Xeon(R) CPU X5670
Socket LGA1366

Intel(R) Xeon(R) CPU E5-2620 v2
Socket LGA2011



Платформа/Материнская Плата

System Information
        Manufacturer: HP
        Product Name: ProLiant DL180 G6
        Version:
        Serial Number: CZJ0220BHZ
        UUID: 01245e64-8efe-d511-b3f4-d8d385e535ec
        Wake-up Type: Power Switch
        SKU Number: 470065-095
        Family:
Base Board Information
        Manufacturer: Supermicro
        Product Name: X9DRW



Просмотр информации о "железе"
numactl

numactl --hardware

available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
node 0 size: 96691 MB
node 0 free: 58301 MB
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
node 1 size: 96728 MB
node 1 free: 66809 MB
node distances:
node   0   1
  0:  10  20
  1:  20  10

numactl --hardware

available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
node 0 size: 32154 MB
node 0 free: 31402 MB
node 1 cpus: 6 7 8 9 10 11 18 19 20 21 22 23
node 1 size: 32204 MB
node 1 free: 31733 MB
node distances:
node   0   1
  0:  10  21
  1:  21  10



Просмотр статистики использования:
/sys/devices/system/node/node0/numastat
/sys/devices/system/node/node1/numastat
numastat
Важное замечание: эта статистика отражает аллокцию страниц, но не обращения к ним, по-тому возможна ситуация когда идет обращение к чужим страницам и оно не попадает в эту статистику

numastat
                           node0           node1
numa_hit                52314463        58897099
numa_miss                      0               0
numa_foreign                   0               0
interleave_hit             28279           28251
local_node              52312978        58861619
other_node                  1485           35480
numastat
                           node0           node1
numa_hit                  945918          557506
numa_miss                      0               0
numa_foreign                   0               0
interleave_hit             16862           16657
local_node                944697          538529
other_node                  1221           18977



lstopo
В выводе команды можно видеть что в случае более старой платформы устройства PCIe не выделенны к какой то отдельной NUMA-ноде, в отличии от более новой платформы
TODO: добавить сетевую карту во второй слот для проверки
Топология платы приведена на картинке под таблицей

lstopo

Machine (189GB total)
  Package L#0
    NUMANode L#0 (P#0 94GB)
    L3 L#0 (12MB)
      L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
        PU L#0 (P#0)
        PU L#1 (P#12)
      L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
        PU L#2 (P#1)
        PU L#3 (P#13)
      L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
        PU L#4 (P#2)
        PU L#5 (P#14)
      L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
        PU L#6 (P#3)
        PU L#7 (P#15)
      L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
        PU L#8 (P#4)
        PU L#9 (P#16)
      L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
        PU L#10 (P#5)
        PU L#11 (P#17)
  Package L#1
    NUMANode L#1 (P#1 94GB)
    L3 L#1 (12MB)
      L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
        PU L#12 (P#6)
        PU L#13 (P#18)
      L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
        PU L#14 (P#7)
        PU L#15 (P#19)
      L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
        PU L#16 (P#8)
        PU L#17 (P#20)
      L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
        PU L#18 (P#9)
        PU L#19 (P#21)
      L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
        PU L#20 (P#10)
        PU L#21 (P#22)
      L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
        PU L#22 (P#11)
        PU L#23 (P#23)
  HostBridge
    PCIBridge
      PCI 0a:00.0 (Ethernet)
        Net "enp10s0f0"
      PCI 0a:00.1 (Ethernet)
        Net "enp10s0f1"
    PCIBridge
      PCI 09:00.0 (RAID)
        Block(Disk) "sdf"
        Block(Disk) "sdd"
        Block(Disk) "sdb"
        Block(Disk) "sdg"
        Block(Disk) "sde"
        Block(Disk) "sdc"
        Block(Disk) "sda"
        Block(Disk) "sdh"
    PCIBridge
      PCIBridge
        PCIBridge
          PCI 08:00.0 (Ethernet)
            Net "enp8s0f0"
          PCI 08:00.1 (Ethernet)
            Net "enp8s0f1"
        PCIBridge
          PCI 07:00.0 (Ethernet)
            Net "enp7s0f0"
          PCI 07:00.1 (Ethernet)
            Net "enp7s0f1"
    PCIBridge
      PCI 04:00.0 (Storage)
    PCIBridge
      PCI 02:00.0 (VGA)
    PCI 00:1f.2 (SATA)
      Block(Disk) "sdi"

lstopo

lstopo
Machine (63GB total)
  Package L#0
    NUMANode L#0 (P#0 31GB)
    L3 L#0 (15MB)
      L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0
        PU L#0 (P#0)
        PU L#1 (P#12)
      L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1
        PU L#2 (P#1)
        PU L#3 (P#13)
      L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2
        PU L#4 (P#2)
        PU L#5 (P#14)
      L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3
        PU L#6 (P#3)
        PU L#7 (P#15)
      L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4
        PU L#8 (P#4)
        PU L#9 (P#16)
      L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5
        PU L#10 (P#5)
        PU L#11 (P#17)
    HostBridge
      PCIBridge
        PCI 02:00.0 (Ethernet)
          Net "eno1"
        PCI 02:00.1 (Ethernet)
          Net "eno2"
      PCIBridge
        PCI 04:00.0 (Ethernet)
          Net "enp4s0f0"
        PCI 04:00.1 (Ethernet)
          Net "enp4s0f1"
      PCIBridge
        PCI 07:00.0 (SAS)
      PCIBridge
        PCIBridge
          PCIBridge
            PCIBridge
              PCI 0c:00.0 (VGA)
      PCI 00:1f.2 (SATA)
        Block(Disk) "sdd"
        Block(Disk) "sdb"
        Block(Disk) "sdc"
        Block(Disk) "sda"
  Package L#1
    NUMANode L#1 (P#1 31GB)
    L3 L#1 (15MB)
      L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6
        PU L#12 (P#6)
        PU L#13 (P#18)
      L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7
        PU L#14 (P#7)
        PU L#15 (P#19)
      L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8
        PU L#16 (P#8)
        PU L#17 (P#20)
      L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9
        PU L#18 (P#9)
        PU L#19 (P#21)
      L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10
        PU L#20 (P#10)
        PU L#21 (P#22)
      L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11
        PU L#22 (P#11)
        PU L#23 (P#23)



Получить список устройств принадллежащих определенной NUMA-ноде можно примерно таким скриптом
В примере - поиск всех устройст не относящихся к Node 0 ([ "${NUMA_NODE}" -ne "0" ])

for DEV in $(find /sys/* -wholename "*/numa_node" ); do NUMA_NODE=$(cat ${DEV}); if [ "${NUMA_NODE}" -ne "0" ]; then PCI_ID=$(echo ${DEV}| awk -F '/' '{ print $(NF-1) }' | awk -F':' '{ print $2":"$3}'); DEVICE_NAME=$(lspci | grep -F "${PCI_ID}"); echo "NUMA_NODE=${NUMA_NODE} ${DEVICE_NAME} ${DEV} ${PCI_ID}"; fi; done


В выводе ниже можно видеть что для PCI устройств на более старой платформе NUMA-нода не определена (-1)
в то время как на новой платформе часть устройств относится к NUMA-ноде 1


Пример вывода (частично) Intel(R) Xeon(R) CPU X5670 Socket LGA1366

NUMA_NODE=-1 0a:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) /sys/devices/pci0000:00/0000:00:01.0/0000:0a:00.0/numa_node 0a:00.0
NUMA_NODE=-1 0a:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01) /sys/devices/pci0000:00/0000:00:01.0/0000:0a:00.1/numa_node 0a:00.1
NUMA_NODE=-1 07:00.0 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:04.0/0000:07:00.0/numa_node 07:00.0
NUMA_NODE=-1 07:00.1 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:04.0/0000:07:00.1/numa_node 07:00.1
NUMA_NODE=-1 08:00.0 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:02.0/0000:08:00.0/numa_node 08:00.0
NUMA_NODE=-1 08:00.1 Ethernet controller: Intel Corporation 82571EB/82571GB Gigabit Ethernet Controller (Copper) (rev 06) /sys/devices/pci0000:00/0000:00:07.0/0000:05:00.0/0000:06:02.0/0000:08:00.1/numa_node 08:00.1

Пример вывода (частично) Для Intel(R) Xeon(R) CPU E5-2620 v2 Socket LGA2011

NUMA_NODE=1 ff:13.4 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 QPI Ring Registers (rev 04) /sys/devices/pci0000:ff/0000:ff:13.4/numa_node ff:13.4
NUMA_NODE=1 ff:10.2 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 Integrated Memory Controller 1 Channel 0-3 ERROR Registers 0 (rev 04) /sys/devices/pci0000:ff/0000:ff:10.2/numa_node ff:10.2
NUMA_NODE=1 ff:08.0 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 QPI Link 0 (rev 04) /sys/devices/pci0000:ff/0000:ff:08.0/numa_node ff:08.0
NUMA_NODE=1 ff:0d.0 System peripheral: Intel Corporation Xeon E7 v2/Xeon E5 v2/Core i7 Unicast Registers (rev 04) /sys/devices/pci0000:ff/0000:ff:0d.0/numa_node ff:0d.0


Примеры работы с NUMA

Описание ячейки

Intel(R) Xeon(R) CPU X5670
Socket LGA1366

Intel(R) Xeon(R) CPU E5-2620 v2
Socket LGA2011



Проверка для сетевых карт

Не привязана к NUMA-ноде

cat /sys/class/net/enp10s0f1/device/numa_node
-1

Привязана к NUMA-ноде (c номером 0)

cat /sys/class/net/enp4s0f0/device/numa_node
0




To Be Added

To Be Added

To Be Added


X9DRW-3LN4F+/3TF+

NUMA 5 X9DRW-3LN4F.png

Ссылки