PCIe (Peripheral Component Interconnect Express) is the high-speed serial bus standard that connects a computer’s CPU/chipset to peripherals like GPUs, NVMe SSDs, and network cards. Given your NVMe/NVMeOF work, it’s the underlying transport your NVMe drives actually sit on
subgraph "Server Architecture" direction TB subgraph "NUMA Node 0 (Socket 0)" CPU0[CPU 0]:::node MEM0[(Local Memory)]:::memory RC0[PCIe Root Complex 0]:::pcie CPU0 --- MEM0 CPU0 --- RC0 NIC[InfiniBand NIC]:::dev NVME0[NVMe SSD 0]:::dev RC0 --- NIC RC0 --- NVME0 P1((Process Pinned to 0)):::procLocal P1 -.->|Optimal: Direct Access| MEM0 P1 -.->|Optimal: Local PCIe| NIC end CPU0 <-->|UPI/Infinity Fabric<br/>Cross-Socket Link| CPU1:::crosslink subgraph "NUMA Node 1 (Socket 1)" CPU1[CPU 1]:::node MEM1[(Local Memory)]:::memory RC1[PCIe Root Complex 1]:::pcie CPU1 --- MEM1 CPU1 --- RC1 NVME1[NVMe SSD 1]:::dev RC1 --- NVME1 P2((Process Pinned to 1)):::procRemote P2 -.->|Optimal: Direct Access| MEM1 P2 -.->|Sub-optimal: UPI Penalty| NIC end end
Server Architecture Topology
NUMA Node 0 (Socket 0) The CPU acts as the memory controller for its local RAM banks and provides PCIe lanes via its internal Root Complex. The InfiniBand NIC and NVMe SSD 0 plug directly into slots governed by this CPU.
Process A (Pinned to Node 0): When this process runs, it has fast, direct access to the local memory. When it initiates RDMA via the InfiniBand NIC, the PCIe traffic stays entirely within Node 0.
Cross-Socket Link (UPI / Infinity Fabric) This is the bridge connecting the two CPUs. It carries memory reads/writes and PCIe traffic when a component on one side needs to talk to the other side.
NUMA Node 1 (Socket 1) The second CPU has its own memory banks and its own PCIe Root Complex. NVMe SSD 1 plugs in here.
Process B (Pinned to Node 1): This process has fast access to its local memory. However, if it tries to use the InfiniBand NIC (which is physically attached to Node 0), the data must travel across the UPI link, incurring a cross-socket latency penalty.