Determinar o nó NUMA do dispositivo PCIe

9

Supondo que haja um sistema operacional Linux bastante recente, existe uma maneira fácil de determinar a qual nó NUMA o slot PCIe, onde um dispositivo está conectado, pertence?


fonte

Respostas:

10

Você deve ir para o diretório do slot PCIe em questão, por exemplo eth0:

 cd /sys/class/net/eth0/device

onde você encontrará numa_node, local_cpuse local_cpulistos três arquivos de seu interesse. Você pode apenas cateles e ver os dados desejados.

MariusMatutiae
fonte
Huh, eu tenho numa_node = -1e local_cpulist = 0-15. Isso não pode estar certo, eu tenho 2 nós numa, conforme confirmado pelo hwloc.
Navin
3

Você também pode usar o hwloc ( http://www.open-mpi.de/projects/hwloc/ ) se souber o ID do dispositivo. No entanto, se você possui 2 do mesmo dispositivo (por exemplo, GPUs), a única maneira de conhecer o nó NUMA ao qual o slot físico está associado é dar uma olhada no manual da placa-mãe.

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

GuillermoMA
fonte
Se verdadeiro, provavelmente é dependente da arquitetura. Por exemplo, nas últimas gerações de processadores Intel Xeon, a ponte raiz PCIe está no próprio chip da CPU. Portanto, conhecer o soquete da CPU em que reside o barramento PCIe de um dispositivo é um requisito essencial para a operação. Isso é evidenciado pela resposta "/ sys / class ..." acima neste caso. Nesses mesmos sistemas, duas CPUs idênticas em soquetes diferentes mostrariam dispositivos NUMA diferentes. Como alternativa, na maioria dos sistemas, dispositivos em diferentes ônibus teria significativamente diferentes endereços PCIe, por exemplo 1a: 00.0 no soquete 1 e 89: 00.0 no soquete 2.
Paul
2

A resposta aceita funciona apenas para placas de rede, até onde eu descobri. De acordo com a resposta do GuillermoMA, o hwloc fornecerá o negócio real, mesmo que não seja tão legível. lstopoé encontrado no pacote hwloc (pelo menos no 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 é, obviamente, CPU0 e NUMANode L # 1 é CPU1. Você pode pegar seu número PCI favorito acima, por exemplo, 14e4: 16a1 e descobrir o que é, e seu endereço PCI para análises adicionais 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)

Em uma das minhas máquinas, uma placa Emulex Fibre Channel não apareceu na lstoposaída. Eu o encontrei usando lstopo --whole-io, executando o processo de pesquisa inversa (role para a direita, se for necessário, para ver o número hexadecimal de 10df que eu espero):

# 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

Remova o comando grep canalizado acima e vasculhe a saída semi-manualmente para encontrar o dispositivo em lstopo --whole-iotela cheia (deixado como um exercício para o leitor).

Mike S
fonte
lspci -nn | grep PCINUMBERfez o meu dia. Eu tenho dois Samsung 970 Pro e esse comando me ajudou a identificá-los na ltoposaída. Obrigado.
pietrop 10/08/19
0

Pode-se começar a usar: # cat /sys/bus/pci/devices/<PCI device>/numa_node

Obter o endereço do dispositivo PCI usando # lspci -nn

Bainha
fonte