Determinare il nodo NUMA del dispositivo PCIe


9

Supponendo che il sistema operativo Linux sia abbastanza recente, esiste un modo semplice per determinare a quale nodo NUMA appartiene lo slot PCIe, a cui è collegato un dispositivo?

Risposte:


10

È necessario andare alla directory dello slot PCIe in questione, ad esempio eth0:

 cd /sys/class/net/eth0/device

dove troverai numa_node, local_cpuse local_cpulist, i tre file che ti interessano. Puoi solo catloro e vedere i dati desiderati.


Eh, ho capito numa_node = -1e local_cpulist = 0-15. Non può essere esatto, ho 2 nodi numa come confermato da hwloc.
Navin,

3

Puoi anche usare hwloc ( http://www.open-mpi.de/projects/hwloc/ ) se conosci l'ID del dispositivo. Tuttavia, se si dispone di 2 dello stesso dispositivo (ad esempio, GPU), l'unico modo per conoscere il nodo NUMA a cui è associato lo slot fisico è quello di dare un'occhiata al manuale della scheda madre.

Per l'Asus Z9PE-D8 ( http://dlcdnet.asus.com/pub/ASUS/mb/LGA2011/Z9PE-D8-WS/Manual/e8726_z9pe-d8_ws.pdf ) è nella pagina 223.


Se vero, probabilmente dipende dall'architettura. Ad esempio, nelle ultime generazioni di processori Intel Xeon, il bridge radice PCIe si trova sul chip CPU stesso. Pertanto, conoscere il socket della CPU in cui risiede il bus PCIe di un dispositivo è un requisito fondamentale per il funzionamento. Ciò è evidenziato dalla risposta "/ sys / class ..." sopra in questo caso. Su questi stessi sistemi, due CPU identiche su socket diversi mostrerebbero diversi dispositivi NUMA. In alternativa, sulla maggior parte dei sistemi, i dispositivi su bus diversi avrebbero indirizzi PCIe significativamente diversi, ad esempio 1a: 00.0 sul socket 1 e 89: 00.0 sul socket 2.
Paul,

2

La risposta accettata funziona solo per le schede di rete, per quanto ne ho trovato. Secondo la risposta di GuillermoMA, hwloc ti darà il vero affare anche se non è così leggibile. lstoposi trova nel pacchetto hwloc (almeno su 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 è, ovviamente, CPU0 e NUMANode L # 1 è CPU1. Puoi quindi prendere il tuo numero PCI preferito da quanto sopra, ad esempio 14e4: 16a1, e scoprire di cosa si tratta, e il suo indirizzo PCI per ulteriori analisi da 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)

Su una delle mie macchine, una scheda Emulex Fibre Channel non è stata visualizzata lstoponell'output. L'ho trovato usando lstopo --whole-io, eseguendo il processo di ricerca inversa (scorrere verso destra, se necessario, per vedere il numero esadecimale 10df per il quale cerco):

# 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

Rimuovi il comando grep convogliato, sopra, e fruga nell'output semi-manualmente per trovare il dispositivo nella lstopo --whole-iovisualizzazione completa (lasciato come esercizio per il lettore).


lspci -nn | grep PCINUMBERha reso la mia giornata. Ho due Samsung 970 Pro e quel comando mi ha aiutato a identificarli ltopodall'output. Grazie.
pietrop,

0

Si può usare: # cat /sys/bus/pci/devices/<PCI device>/numa_node

Ottieni l'indirizzo del dispositivo PCI utilizzando # lspci -nn

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.