Determinar el nodo NUMA del dispositivo PCIe


9

Suponiendo que el sistema operativo Linux es bastante reciente, ¿hay una manera fácil de determinar a qué nodo NUMA pertenece la ranura PCIe, donde está conectado un dispositivo?

Respuestas:


10

Debe ir al directorio de la ranura PCIe en cuestión, por ejemplo eth0:

 cd /sys/class/net/eth0/device

donde se encuentra numa_node, local_cpusy local_cpulist, los tres archivos de su interés. Puede simplemente catellos y ver los datos deseados.


Huh, tengo numa_node = -1y local_cpulist = 0-15. Eso no puede ser correcto, tengo 2 nodos numa según lo confirmado por hwloc.
Navin

3

También puede usar hwloc ( http://www.open-mpi.de/projects/hwloc/ ) si conoce la identificación del dispositivo. Sin embargo, si tiene 2 del mismo dispositivo (por ejemplo, GPU), la única forma de conocer el nodo NUMA al que está asociada la ranura física es echar un vistazo al manual de la placa base.

Para el Asus Z9PE-D8 ( http://dlcdnet.asus.com/pub/ASUS/mb/LGA2011/Z9PE-D8-WS/Manual/e8726_z9pe-d8_ws.pdf ) está en la página 223.


Si es cierto, probablemente depende de la arquitectura. Por ejemplo, en las últimas generaciones de procesadores Intel Xeon, el puente raíz PCIe está en el chip de la CPU. Por lo tanto, conocer el zócalo de la CPU donde reside el bus PCIe de un dispositivo es un requisito central para la operación. Esto se evidencia por la respuesta "/ sys / class ..." anterior en este caso. En estos mismos sistemas, dos CPU idénticas en diferentes zócalos mostrarían diferentes dispositivos NUMA. Alternativamente, en la mayoría de los sistemas, los dispositivos en diferentes buses tendrían direcciones PCIe significativamente diferentes, por ejemplo, 1a: 00.0 en el zócalo 1, y 89: 00.0 en el zócalo 2.
Paul

2

La respuesta aceptada solo funciona para tarjetas de red, por lo que he encontrado. Según la respuesta de GuillermoMA, hwloc te dará el trato real incluso si no es tan legible. lstopose encuentra en el paquete hwloc (al menos en 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 es, por supuesto, CPU0 y NUMANode L # 1 es CPU1. Luego puede tomar su número PCI favorito de los anteriores, por ejemplo, 14e4: 16a1, y descubrir cuál es, y su dirección PCI para un análisis posterior de 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)

En una de mis máquinas, una tarjeta de canal de fibra Emulex no apareció en la lstoposalida. Lo encontré usando lstopo --whole-io, realizando el proceso de búsqueda inversa (desplácese hacia la derecha si es necesario, para ver el número hexadecimal de 10df que busco):

# 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

Elimine el comando grep entubado, arriba, y revise la salida de forma semi-manual para encontrar el dispositivo en la lstopo --whole-iopantalla completa (izquierda como ejercicio para el lector).


lspci -nn | grep PCINUMBERme alegró el día. Tengo dos Samsung 970 Pro y ese comando me ayudó a identificarlos desde la ltoposalida. Gracias.
pietrop

0

Uno puede usar: # cat /sys/bus/pci/devices/<PCI device>/numa_node

Obtenga la dirección del dispositivo PCI utilizando # lspci -nn

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.