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

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
 
(не показаны 52 промежуточные версии этого же участника)
Строка 1: Строка 1:
[[Категория:Numa]]
+
[[Категория:NUMA]]
 
[[Категория:Linux]]
 
[[Категория:Linux]]
 
[[Категория:Hardware]]
 
[[Категория:Hardware]]
Строка 17: Строка 17:
 
Ответ на вопрос - "Да, работать будет", но с некоторыми оговорками.
 
Ответ на вопрос - "Да, работать будет", но с некоторыми оговорками.
 
=<code>Supermicro X8DTN</code>=
 
=<code>Supermicro X8DTN</code>=
Подавляющее большинство материнских плат «просто работают», <BR>
+
'''TL; DR:''' Подавляющее большинство материнских плат «просто работают», <BR> если поставить процессор в сокет с наименьшим номером
если вы поставить процессор в сокет с наименьшим номером
 
 
<BR>
 
<BR>
Это справедливо как для материнских плат Intel, так и для AMD в целом, а в случае сомнения информацию можнонайти в руководстве (но у меня никогда таких сомнений не было)
+
Это справедливо как для материнских плат Intel, так и для AMD в целом, а в случае сомнения информацию можно найти в руководстве (но у меня никогда таких сомнений не было)
   
 
Вот пример материнской платы Supermicro X8DTN, которая представляла собой довольно двухпроцессорную плату Xeon серий Intel 5500 и 5600.
 
Вот пример материнской платы Supermicro X8DTN, которая представляла собой довольно двухпроцессорную плату Xeon серий Intel 5500 и 5600.
Строка 26: Строка 25:
 
[[Файл:NUMA 1 Supermicro-X8DTN-Block-Diagram.png]]
 
[[Файл:NUMA 1 Supermicro-X8DTN-Block-Diagram.png]]
 
<BR>
 
<BR>
  +
 
=Dell C6100=
 
=Dell C6100=
 
Поскольку наборы микросхем Intel серий 5500 и 5520 имели северный мост IOH,
 
Поскольку наборы микросхем Intel серий 5500 и 5520 имели северный мост IOH,
Строка 85: Строка 85:
   
 
=Linux=
 
=Linux=
  +
{| class="wikitable"
 
  +
Для работы с NUMA в Linux есть некоторое колличество инструментов:
  +
  +
{| class="wikitable" style="width: 100%"
 
|+ Примеры работы с NUMA
 
|+ Примеры работы с NUMA
 
|-
 
|-
Строка 100: Строка 103:
   
   
  +
|-
 
  +
|
 
  +
|- style="vertical-align:top;"
  +
|style="width: 10%" |
 
Платформа/Материнская Плата
 
Платформа/Материнская Плата
  +
|style="width: 45%" |
|
 
 
<PRE>
 
<PRE>
 
System Information
 
System Information
Строка 115: Строка 120:
 
Family:
 
Family:
 
</PRE>
 
</PRE>
  +
|style="width: 100%" |
||
 
 
<PRE>
 
<PRE>
 
Base Board Information
 
Base Board Information
Строка 121: Строка 126:
 
Product Name: X9DRW
 
Product Name: X9DRW
 
</PRE>
 
</PRE>
  +
|-
 
  +
  +
  +
  +
  +
|- style="vertical-align:top;"
 
|
 
|
  +
Просмотр информации о "железе"<BR>
1111
 
  +
<code>numactl</code>
 
|
 
|
  +
<code>numactl --hardware</code>
 
<PRE>
 
<PRE>
numactl --hardware
 
 
available: 2 nodes (0-1)
 
available: 2 nodes (0-1)
 
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
 
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
Строка 139: Строка 150:
 
1: 20 10
 
1: 20 10
 
</PRE>
 
</PRE>
Текст ячейки
 
|-
 
 
|
 
|
  +
<code>
  +
numactl --hardware
  +
</code>
 
<PRE>
 
<PRE>
numactl --hardware
 
 
available: 2 nodes (0-1)
 
available: 2 nodes (0-1)
 
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
 
node 0 cpus: 0 1 2 3 4 5 12 13 14 15 16 17
Строка 155: Строка 166:
 
0: 10 21
 
0: 10 21
 
1: 21 10
 
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>
 
<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>
{{#spoiler:show=show version|
 
  +
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>
 
<PRE>
  +
Machine (189GB total)
cisco WS-C3560G-48PS (PowerPC405) processor (revision H0) with 131072K bytes of memory.
 
  +
Package L#0
Switch Ports Model SW Version SW Image
 
  +
NUMANode L#0 (P#0 94GB)
------ ----- ----- ---------- ----------
 
  +
L3 L#0 (12MB)
* 1 52 WS-C3560G-48PS 12.2(55)SE12 C3560-IPBASEK9-M
 
  +
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>
 
</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]]
   
 
=Ссылки=
 
=Ссылки=

Текущая версия на 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

Ссылки