1. PCIe Switch概述:什么是PCIe Switch、Switch在系统中的作用、与Root Complex和Endpoint的关系

各位同学好,我是老温。今天咱们开始聊PCIe Switch,这是整个PCIe拓扑里最核心的部件之一。说实话,我刚开始接触PCIe时,总觉得Switch就是个简单的“分线器”,后来踩了不少坑才明白——它远比想象中复杂。

1.1 什么是PCIe Switch

PCIe Switch,说白了就是一个智能的PCIe数据交换设备。它内部有多个端口,每个端口都可以连接一个PCIe设备。它的核心任务就是:把数据从一个端口转发到另一个端口。

嗯,这里要注意,Switch不是简单的“复制粘贴”。它内部有路由逻辑、流量控制、虚拟通道管理这些复杂机制。我曾在项目中遇到过一个问题:两个Endpoint同时向Root Complex发数据,结果Switch内部缓冲区爆了,导致整个系统卡死。后来才发现是Switch的VC配置没调好。

核心要点:PCIe Switch是一个多端口、可扩展的交换设备,它实现了PCIe协议的完整事务层、数据链路层和物理层功能。

1.2 Switch在系统中的作用

Switch在系统里扮演什么角色?我总结了三件事:

  • 扩展端口数量:Root Complex的端口有限,一个Switch可以挂多个Endpoint
  • 隔离流量域:不同端口之间的流量可以互相隔离,互不干扰
  • 提升带宽利用率:通过虚拟通道和仲裁机制,让多个设备共享链路带宽

你想想看,如果没有Switch,一个服务器只能接几个PCIe设备。有了Switch,你可以接几十个NVMe SSD、GPU、网卡,这就是它的价值所在。

个人经验:我在做存储服务器时,用了一个PCIe Gen4 Switch接了16块NVMe SSD。如果不做VC隔离,一块盘做格式化时,其他盘的IO延迟会飙升到几百微秒。后来配置了独立的VC,延迟稳定在10微秒以内。

1.3 与Root Complex和Endpoint的关系

这三者的关系,我用一张图来说明:

Root Complex CPU/内存接口 PCIe Switch 数据转发/路由 VC管理/仲裁 Endpoint 1 NVMe SSD Endpoint 2 GPU Endpoint 3 网卡 上行端口 下行端口 下行端口 下行端口

这张图展示了典型的PCIe拓扑结构。Root Complex是“老大”,它连接CPU和内存。Switch是“中间人”,负责把Root Complex的命令转发给各个Endpoint。Endpoint就是“干活的人”,比如SSD存数据、GPU算图形、网卡收发网络包。

我举个例子你就明白了:

  • Root Complex:就像公司的CEO,发号施令
  • Switch:就像部门经理,把CEO的指令分派给各个员工
  • Endpoint:就像一线员工,具体干活

为什么会这样设计?因为CPU的PCIe端口有限,而且每个端口需要复杂的物理层逻辑。如果让CPU直接连几十个设备,芯片面积和功耗都受不了。Switch就是来解决这个问题的。

避坑指南:我曾经在一个项目中,把Switch的上行端口配置成了x4,结果Root Complex只支持x8。虽然能工作,但带宽只有一半。后来我学乖了,设计前一定先确认Root Complex和Switch的端口宽度匹配。

1.4 Switch的内部架构

Switch内部其实是个“小交换机”。它包含:

组件 功能 我的经验
端口逻辑 每个端口独立处理物理层、数据链路层、事务层 端口之间完全隔离,一个端口出问题不影响其他
内部路由 根据地址或ID决定数据转发到哪个端口 路由表配置错了,数据就跑到别的地方去了
VC管理 管理多个虚拟通道,实现QoS 这是最容易被忽视的部分,但影响很大
仲裁器 决定哪个端口的数据优先发送 仲裁策略选错了,高优先级流量会被堵住

嗯,这里要特别说一下VC管理。每个端口可以有多个虚拟通道,每个VC都有自己的缓冲区。你可以把VC想象成高速公路上的车道——普通数据走慢车道,实时数据走快车道。这样即使普通数据堵车,实时数据也能畅通无阻。

小技巧:如果你在做视频采集卡项目,记得把视频流配置到VC1,控制命令配置到VC0。这样即使视频数据量很大,控制命令也能及时响应。我试过不配置VC,结果调整分辨率时画面卡了半秒钟。

1.5 实际应用场景

PCIe Switch在哪些地方最常见?我列几个:

  1. 服务器:连接多个NVMe SSD、GPU、网卡
  2. 存储阵列:扩展端口数量,连接几十块硬盘
  3. 嵌入式系统:连接FPGA、DSP、视频采集卡
  4. 测试设备:连接多个PCIe设备进行压力测试

我记得有一次做服务器项目,客户要求接24块NVMe SSD。Root Complex只有4个端口,每个端口只能接一个NVMe。怎么办?加一个PCIe Switch,一个上行端口接Root Complex,6个下行端口各接4块SSD(通过Bifurcation拆分)。完美解决。

好了,这一章就讲到这里。PCIe Switch的基本概念、作用和拓扑关系,你应该已经清楚了。下一章我们深入聊聊Switch的端口配置和Bifurcation,这是实际项目中经常遇到的技术点。


公众号:蓝海资料掘金营,微信deep3321