Déterminer le nœud NUMA du périphérique PCIe

9

En supposant un système d'exploitation Linux assez récent, existe-t-il un moyen facile de déterminer à quel nœud NUMA l'emplacement PCIe, où un périphérique est branché, appartient?


la source

Réponses:

10

Vous devez vous rendre dans le répertoire de l'emplacement PCIe en question, par exemple eth0:

 cd /sys/class/net/eth0/device

où vous trouverez numa_node, local_cpuset local_cpulist, les trois dossiers d'intérêt pour vous. Vous pouvez juste catles voir et voir les données souhaitées.

MariusMatutiae
la source
Huh, j'ai eu numa_node = -1et local_cpulist = 0-15. Cela ne peut pas être vrai, j'ai 2 nœuds numa comme confirmé par hwloc.
Navin
3

Vous pouvez également utiliser hwloc ( http://www.open-mpi.de/projects/hwloc/ ) si vous connaissez l'ID de l'appareil. Cependant, si vous avez 2 du même périphérique (par exemple, des GPU), la seule façon de connaître le nœud NUMA auquel l'emplacement physique est associé est de consulter le manuel de la carte mère.

Pour l'Asus Z9PE-D8 ( http://dlcdnet.asus.com/pub/ASUS/mb/LGA2011/Z9PE-D8-WS/Manual/e8726_z9pe-d8_ws.pdf ), c'est à la page 223.

GuillermoMA
la source
Si vrai, cela dépend probablement de l'architecture. Par exemple, au cours des dernières générations de processeurs Intel Xeon, le pont racine PCIe se trouve sur la puce CPU elle-même. Ainsi, connaître le socket du CPU où réside le bus PCIe d'un périphérique est une exigence fondamentale pour le fonctionnement. Ceci est démontré par la réponse "/ sys / class ..." ci-dessus dans ce cas. Sur ces mêmes systèmes, deux CPU identiques sur des sockets différents afficheraient différents périphériques NUMA. Alternativement, sur la plupart des systèmes, les périphériques sur différents bus auraient des adresses PCIe considérablement différentes, par exemple 1a: 00.0 sur le socket 1 et 89: 00.0 sur le socket 2.
Paul
2

La réponse acceptée ne fonctionne que pour les cartes réseau, pour autant que je sache. Selon la réponse de GuillermoMA, hwloc vous donnera la vraie affaire même si elle n'est pas aussi lisible. lstopose trouve dans le paquet hwloc (au moins sur 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 est, bien sûr, CPU0 et NUMANode L # 1 est CPU1. Vous pouvez ensuite prendre votre numéro PCI préféré à partir de ce qui précède, par exemple 14e4: 16a1, et découvrir de quoi il s'agit, et son adresse PCI pour une analyse plus approfondie à partir 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)

Sur une de mes machines, une carte Emulex Fibre Channel n'apparaissait pas dans la lstoposortie. Je l'ai trouvé en utilisant lstopo --whole-io, en effectuant le processus de recherche inversée (faites défiler vers la droite si vous le devez, pour voir le numéro hexadécimal 10df que je convoite):

# 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

Supprimez la commande piped grep ci-dessus et fouillez la sortie semi-manuellement pour trouver le périphérique en plein lstopo --whole-ioécran (à gauche comme exercice pour le lecteur).

Mike S
la source
lspci -nn | grep PCINUMBERfait ma journée. J'ai deux Samsung 970 Pro et cette commande m'a aidé à les identifier à partir de la ltoposortie. Je vous remercie.
pietrop
0

On peut utiliser: # cat /sys/bus/pci/devices/<PCI device>/numa_node

Obtenez l'adresse du périphérique PCI à l'aide # lspci -nn

Ourlet
la source