Определить устройство PCIe NUMA узла

9

Предполагая, что операционная система Linux довольно недавняя, существует ли простой способ определить, к какому узлу NUMA принадлежит слот PCIe, к которому подключено устройство?


источник

Ответы:

10

Вы должны перейти в каталог соответствующего слота PCIe, например eth0:

 cd /sys/class/net/eth0/device

где вы найдете numa_node, local_cpusи local_cpulistтри файла, представляющих интерес для вас. Вы можете только catих, и увидеть нужные данные.

MariusMatutiae
источник
Да, я получил numa_node = -1и local_cpulist = 0-15. Это не может быть правдой, у меня есть 2 узла numa, что подтверждено hwloc.
Навин
3

Вы также можете использовать hwloc ( http://www.open-mpi.de/projects/hwloc/ ), если вам известен идентификатор устройства. Однако, если у вас есть 2 одинаковых устройства (например, графические процессоры), единственный способ узнать узел NUMA, с которым связан физический слот, - это посмотреть руководство по материнской плате.

Для Asus Z9PE-D8 ( http://dlcdnet.asus.com/pub/ASUS/mb/LGA2011/Z9PE-D8-WS/Manual/e8726_z9pe-d8_ws.pdf ) это на странице 223.

GuillermoMA
источник
Если это правда, это, вероятно, зависит от архитектуры. Например, в последних нескольких поколениях процессоров Intel Xeon корневой мост PCIe находится на самом чипе процессора. Таким образом, знание гнезда ЦП, где находится шина PCIe устройства, является основным требованием для работы. Об этом свидетельствует ответ "/ sys / class ..." выше в этом случае. В этих же системах два одинаковых ЦП на разных сокетах будут показывать разные устройства NUMA. Кроме того, в большинстве систем устройства на разных шинах могут иметь существенно разные адреса PCIe, например, 1a: 00.0 в сокете 1 и 89: 00.0 в сокете 2.
Пол
2

Принятый ответ работает только для сетевых карт, насколько я нашел. Согласно ответу GuillermoMA, hwloc даст вам реальную сделку, даже если она не так разборчива. lstopoнаходится в пакете hwloc (по крайней мере на RHEL 7):

# lstopo
Machine (256GB)
  NUMANode L#0 (P#0 128GB)
    Socket L#0 + L3 L#0 (20MB)
      L2 L#0 (256KB) + L1d L#0 (32KB) + L1i L#0 (32KB) + Core L#0 + PU L#0 (P#0)
      L2 L#1 (256KB) + L1d L#1 (32KB) + L1i L#1 (32KB) + Core L#1 + PU L#1 (P#2)
      L2 L#2 (256KB) + L1d L#2 (32KB) + L1i L#2 (32KB) + Core L#2 + PU L#2 (P#4)
      L2 L#3 (256KB) + L1d L#3 (32KB) + L1i L#3 (32KB) + Core L#3 + PU L#3 (P#6)
      L2 L#4 (256KB) + L1d L#4 (32KB) + L1i L#4 (32KB) + Core L#4 + PU L#4 (P#8)
      L2 L#5 (256KB) + L1d L#5 (32KB) + L1i L#5 (32KB) + Core L#5 + PU L#5 (P#10)
      L2 L#6 (256KB) + L1d L#6 (32KB) + L1i L#6 (32KB) + Core L#6 + PU L#6 (P#12)
      L2 L#7 (256KB) + L1d L#7 (32KB) + L1i L#7 (32KB) + Core L#7 + PU L#7 (P#14)
    HostBridge L#0
      PCIBridge
        PCI 1000:005d
          Block L#0 "sda"
      PCIBridge
        PCI 14e4:16a1
          Net L#1 "eth0"
        PCI 14e4:16a1
          Net L#2 "eth1"
        PCI 14e4:16a1
          Net L#3 "eth2"
        PCI 14e4:16a1
          Net L#4 "eth3"
      PCI 8086:8d62
      PCIBridge
        PCIBridge
          PCIBridge
            PCIBridge
              PCI 102b:0534
      PCI 8086:8d02
        Block L#5 "sr0"
  NUMANode L#1 (P#1 128GB)
    Socket L#1 + L3 L#1 (20MB)
      L2 L#8 (256KB) + L1d L#8 (32KB) + L1i L#8 (32KB) + Core L#8 + PU L#8 (P#1)
      L2 L#9 (256KB) + L1d L#9 (32KB) + L1i L#9 (32KB) + Core L#9 + PU L#9 (P#3)
      L2 L#10 (256KB) + L1d L#10 (32KB) + L1i L#10 (32KB) + Core L#10 + PU L#10 (P#5)
      L2 L#11 (256KB) + L1d L#11 (32KB) + L1i L#11 (32KB) + Core L#11 + PU L#11 (P#7)
      L2 L#12 (256KB) + L1d L#12 (32KB) + L1i L#12 (32KB) + Core L#12 + PU L#12 (P#9)
      L2 L#13 (256KB) + L1d L#13 (32KB) + L1i L#13 (32KB) + Core L#13 + PU L#13 (P#11)
      L2 L#14 (256KB) + L1d L#14 (32KB) + L1i L#14 (32KB) + Core L#14 + PU L#14 (P#13)
      L2 L#15 (256KB) + L1d L#15 (32KB) + L1i L#15 (32KB) + Core L#15 + PU L#15 (P#15)
    HostBridge L#7
      PCIBridge
        PCI 15b3:1003
          Net L#6 "eth4"
          Net L#7 "eth5"

NUMANode L # 0 - это, конечно, CPU0, а NUMANode L # 1 - это CPU1. Затем вы можете взять ваш любимый номер PCI из вышеприведенного, например, 14e4: 16a1, и узнать, что это такое, и его адрес PCI для дальнейшего анализа из lspci:

# lspci -nn | grep 14e4:16a1
01:00.0 Ethernet controller [0200]: Broadcom Corporation BCM57840 NetXtreme II 10 Gigabit Ethernet [14e4:16a1] (rev 11)
01:00.1 Ethernet controller [0200]: Broadcom Corporation BCM57840 NetXtreme II 10 Gigabit Ethernet [14e4:16a1] (rev 11)
01:00.2 Ethernet controller [0200]: Broadcom Corporation BCM57840 NetXtreme II 10 Gigabit Ethernet [14e4:16a1] (rev 11)
01:00.3 Ethernet controller [0200]: Broadcom Corporation BCM57840 NetXtreme II 10 Gigabit Ethernet [14e4:16a1] (rev 11)

На одной из моих машин карта Emulex Fibre Channel не отображалась на lstopoвыходе. Я нашел это lstopo --whole-io, выполнив процесс обратного поиска (если нужно, прокрутите вправо, чтобы увидеть шестнадцатеричное число 10df, к которому я прибегаю):

# lspci -nn | grep -i emulex
03:00.0 Fibre Channel [0c04]: Emulex Corporation Saturn-X: LightPulse Fibre Channel Host Adapter [10df:f100] (rev 03)
03:00.1 Fibre Channel [0c04]: Emulex Corporation Saturn-X: LightPulse Fibre Channel Host Adapter [10df:f100] (rev 03)
# lstopo --whole-io | grep 10df   
        PCI 10df:f100
        PCI 10df:f100

Удалите приведенную выше команду piped grep и поройтесь в выходных данных полуручно, чтобы найти устройство на полном lstopo --whole-ioэкране (оставлено в качестве упражнения для читателя).

Майк С
источник
lspci -nn | grep PCINUMBERсделал мой день. У меня два Samsung 970 Pro, и эта команда помогла мне идентифицировать их по ltopoвыходным данным . Спасибо.
Пьетроп
0

Можно использовать: # cat /sys/bus/pci/devices/<PCI device>/numa_node

Получить адрес устройства PCI, используя # lspci -nn

гм
источник