Numa: различия между версиями
Sirmax (обсуждение | вклад) (Новая страница: «Категория:Numa Категория:Linux Категория:Hardware =Numa=») |
Sirmax (обсуждение | вклад) (→Linux) |
||
(не показано 98 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
− | [[Категория: |
+ | [[Категория:NUMA]] |
[[Категория:Linux]] |
[[Категория:Linux]] |
||
[[Категория:Hardware]] |
[[Категория:Hardware]] |
||
=Numa= |
=Numa= |
||
+ | Это заготовка перевода статьи про Numa |
||
+ | <BR> |
||
+ | * https://www.servethehome.com/answered-cpu-dual-processor-motherboard/ |
||
+ | с некоторыми моими дополнениями и уточнениями |
||
+ | |||
+ | |||
+ | =Можно ли использовать один CPU в многопроцессорных системах? (и почему)= |
||
+ | |||
+ | Почему возникает такой вопрос? |
||
+ | <BR> |
||
+ | По-тому что системы с 2 и более сокетами на материнской плате допускают возможное расширение без полной замены сервера |
||
+ | <BR> |
||
+ | Ответ на вопрос - "Да, работать будет", но с некоторыми оговорками. |
||
+ | =<code>Supermicro X8DTN</code>= |
||
+ | '''TL; DR:''' Подавляющее большинство материнских плат «просто работают», <BR> если поставить процессор в сокет с наименьшим номером |
||
+ | <BR> |
||
+ | Это справедливо как для материнских плат Intel, так и для AMD в целом, а в случае сомнения информацию можно найти в руководстве (но у меня никогда таких сомнений не было) |
||
+ | |||
+ | Вот пример материнской платы Supermicro X8DTN, которая представляла собой довольно двухпроцессорную плату Xeon серий Intel 5500 и 5600. |
||
+ | <BR> |
||
+ | [[Файл:NUMA 1 Supermicro-X8DTN-Block-Diagram.png]] |
||
+ | <BR> |
||
+ | |||
+ | =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> |
||
+ | [[Файл:NUMA 3 STH-colo-pfsense-node-and-Mellanox-IB-node.png]] |
||
+ | <BR> |
||
+ | На фото в примере можно видеть что установлен только один процессор и заполнена только половина слотов DIMM, соответствующих установленному процессору. |
||
+ | <BR> |
||
+ | |||
+ | Эта конфигурация значительно отличается от более современных систем тспользующих сокет LGA2011 |
||
+ | <BR> |
||
+ | В качестве примера более новой конфигурации рассмотрим плату <code>Supermicro X9DRH-7TF</code>у которой есть onboard <code>LSI SAS</code> и стевая карта 10GbE <code>Intel X540</code>. |
||
+ | |||
+ | =<code>Supermicro X9DRH-7TF</code>= |
||
+ | <BR> |
||
+ | [[Файл:NUMA 0 Supermicro-X9DRH-7TF-Layout.png]] |
||
+ | <BR> |
||
+ | |||
+ | Более свежие архитектуры добавляют еще один уровень сложности. <BR> |
||
+ | На примере двухпроцессорной платформы 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> |
||
+ | [[Файл:NUMA 4 Supermicro-X9DRH-7TF-Block-Diagram.png]] |
||
+ | <BR> |
||
+ | |||
+ | Здесь мы видим, что если бы CPU1 отсутствовал (''гипотетический случай''), |
||
+ | то линии <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 |