Bestimmen Sie den NUMA-Knoten des PCIe-Geräts

9

Gibt es unter der Annahme eines relativ neuen Linux-Betriebssystems eine einfache Möglichkeit, festzustellen, zu welchem ​​NUMA-Knoten der PCIe-Steckplatz gehört, an den ein Gerät angeschlossen ist?


quelle

Antworten:

10

Sie müssen in das Verzeichnis des betreffenden PCIe-Steckplatzes wechseln, zum Beispiel eth0:

 cd /sys/class/net/eth0/device

wo Sie finden numa_node, local_cpusund local_cpulistdie drei Dateien, die Sie interessieren. Sie können nur catsie und sehen die gewünschten Daten.

MariusMatutiae
quelle
Huh, ich habe numa_node = -1und local_cpulist = 0-15. Das kann nicht richtig sein, ich habe 2 numa Knoten, wie von hwloc bestätigt.
Navin
3

Sie können auch hwloc ( http://www.open-mpi.de/projects/hwloc/ ) verwenden, wenn Sie die Geräte-ID kennen. Wenn Sie jedoch zwei gleiche Geräte haben (z. B. GPUs), können Sie den NUMA-Knoten, dem der physische Steckplatz zugeordnet ist, nur anhand des Motherboard-Handbuchs ermitteln.

Für das Asus Z9PE-D8 ( http://dlcdnet.asus.com/pub/ASUS/mb/LGA2011/Z9PE-D8-WS/Manual/e8726_z9pe-d8_ws.pdf ) finden Sie es auf Seite 223.

GuillermoMA
quelle
Wenn dies zutrifft, hängt es wahrscheinlich von der Architektur ab. In den letzten Generationen von Intel Xeon-Prozessoren befindet sich die PCIe-Root-Bridge beispielsweise auf dem CPU-Chip. Die Kenntnis des CPU-Sockels, in dem sich der PCIe-Bus eines Geräts befindet, ist daher eine Grundvoraussetzung für den Betrieb. Dies wird in diesem Fall durch die Antwort "/ sys / class ..." oben belegt. Auf denselben Systemen würden zwei identische CPUs auf unterschiedlichen Sockeln unterschiedliche NUMA-Geräte anzeigen. Alternativ hätten Geräte in verschiedenen Bussen auf den meisten Systemen signifikant unterschiedliche PCIe-Adressen, z. B. 1a: 00.0 auf Sockel 1 und 89: 00.0 auf Sockel 2.
Paul
2

Die akzeptierte Antwort funktioniert nur für Netzwerkkarten, soweit ich sie gefunden habe. Laut der Antwort von GuillermoMA gibt Ihnen hwloc das echte Angebot, auch wenn es nicht so gut lesbar ist. lstopobefindet sich im hwloc-Paket (zumindest auf 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 ist natürlich CPU0 und NUMANode L # 1 ist CPU1. Sie können dann Ihre Lieblings-PCI-Nummer aus dem oben genannten, z. B. 14e4: 16a1, entnehmen und herausfinden, was es ist, und seine PCI-Adresse zur weiteren Analyse von 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)

Auf einem meiner Computer wurde keine Emulex Fibre Channel-Karte in der lstopoAusgabe angezeigt . Ich habe es gefunden lstopo --whole-io, indem ich den Reverse-Lookup-Vorgang ausgeführt habe (scrollen Sie nach rechts, wenn Sie müssen, um die 10-dB-Hex-Zahl zu sehen, nach der ich greife):

# 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

Entfernen Sie den Befehl piped grep oben und durchsuchen Sie die Ausgabe halbmanuell, um das Gerät in der Vollanzeige zu finden lstopo --whole-io(als Übung für den Leser übrig).

Mike S.
quelle
lspci -nn | grep PCINUMBERmeinen Tag gerettet. Ich habe zwei Samsung 970 Pro und dieser Befehl hat mir geholfen, sie anhand der ltopoAusgabe zu identifizieren . Vielen Dank.
Pietrop
0

Man kann verwenden mit: # cat /sys/bus/pci/devices/<PCI device>/numa_node

Rufen Sie die PCI-Geräteadresse mit ab # lspci -nn

Saum
quelle