Numa: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) (→Linux) |
||
(не показано 80 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | [[Категория: |
+ | [[Категория: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> если поставить процессор в сокет с наименьшим номером |
||
− | ==Supermicro X8DTN== |
||
− | Подавляющее большинство материнских плат «просто работают», <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, |
||
установка только одного процессор в двухпроцессорной материнской плате не привела к недоступности каких-то ресурсов материнской платы. |
установка только одного процессор в двухпроцессорной материнской плате не привела к недоступности каких-то ресурсов материнской платы. |
||
<BR> |
<BR> |
||
+ | <BR> |
||
− | Во времена сокета Intel LGA1366, а также на платформах AMD C32 и G34 и северный, и южный мосты находились на материнской плате, поэтому процессоры обычно подключались через северный мост, чтобы получить доступ к шине карты расширения. В этих системах основное влияние наличия только одного ЦП (кроме очевидной потери производительности ЦП без второго ЦП) заключается в том, что невозможно заполнить банки памяти для пустого слота процессора. Это очень похоже на узлы с одним процессором, которые мы используем для проекта колокации STH, хотя каждый узел Dell C6100 поддерживает два процессора. |
||
+ | '''За исключением памяти, так как каждый слот памяти относится к одному из процессоров''' |
||
+ | <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> |
||
Строка 47: | Строка 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.
Dell C6100
Поскольку наборы микросхем Intel серий 5500 и 5520 имели северный мост IOH,
установка только одного процессор в двухпроцессорной материнской плате не привела к недоступности каких-то ресурсов материнской платы.
За исключением памяти, так как каждый слот памяти относится к одному из процессоров
Во времена Intel LGA1366
, а также на платформах AMD
C32
и G34
и северный, и южный мосты находились на материнской плате,
поэтому процессоры обычно подключались через северный мост, чтобы получить доступ к шине PCI
.
В качестве примера можно рассмотреть Dell C6100
(это такой а-ля блейд, 4 ноды в корпусе 2U с общими резервированными блоками питания но каждый со своими дисками и сетью)
C установкой одного процессора и заполнением только половины слотов памяти он будет работать как обычная однопроцессорная система
На фото в примере можно видеть что установлен только один процессор и заполнена только половина слотов DIMM, соответствующих установленному процессору.
Эта конфигурация значительно отличается от более современных систем тспользующих сокет LGA2011
В качестве примера более новой конфигурации рассмотрим плату Supermicro X9DRH-7TF
у которой есть onboard LSI SAS
и стевая карта 10GbE Intel X540
.
Supermicro X9DRH-7TF
Более свежие архитектуры добавляют еще один уровень сложности.
На примере двухпроцессорной платформы Intel Xeon E5 LGA2011 слоты расширения PCIe
напрямую привязаны к процессору.
На изображении выше можно увидеть каждый слот PCIe
, привязанный к определенному процессору.
Когда сокет CPU не заполнен, часть линий PCIe
оказываются "подвешенными в воздухе".
Это оказывает существенное влияние на функциональность материнской платы.
Например, если второй разъем CPU не заполнен на материнской плате с двумя разъемами,
часть устройств встроенных в платк как, например, контроллеры Ethernet
и SAS
, не будут работать.
(Примечание: но это теория, на практике обычно нельзя поставить только второй процессор, а встроенные устройства (соответствующие им линии PCIe
) подключены к первому (или нулевому, зависит от нумерации) процессору. )
Кроме того, как уже сказано, часть линий PCIe
могут будут работать что сделает слоты бесполезными.
Вот соответствующая диаграмма для материнской платыSupermicro X9DRH-7TF
:
Здесь мы видим, что если бы CPU1 отсутствовал (гипотетический случай),
то линии PCIe
встроенных контроллеров Intel X540 10GbE LAN
и LSI SAS2208
оказались бы "висящими в воздухе" (никуда не подключены).
C другой стороны без CPU2 (это уже более реальный случай) не будет доступа к нескольким слотам PCIe 3.0 x8
.
К счастью, большинство производителей материнских плат указывают в своих руководствах соответвие между процессорными сокетами и слотами PCIe
Linux
Для работы с NUMA в Linux есть некоторое колличество инструментов:
Описание ячейки |
|
|
---|---|---|
Платформа/Материнская Плата |
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
|
Просмотр информации о "железе" |
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 |
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
|
Просмотр статистики использования: |
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
|
|
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 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-ноде можно примерно таким скриптом
| ||
Пример вывода (частично) 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 | ||
Пример вывода (частично) Для
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-ноде 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 |