2. PCIe链路配置:链路宽度与速率
好,咱们今天聊聊PCIe链路配置。说白了,就是你的PCIe设备到底能跑多宽、多快。这玩意儿直接决定了吞吐量上限,我每次做系统设计时,第一件事就是确认链路配置对不对。
2.1 链路宽度:x1/x2/x4/x8/x16
链路宽度,就是PCIe通道的数量。一个通道(Lane)包含两对差分信号——一对发送,一对接收。x1就是1个通道,x16就是16个通道。
常见的配置有这些:
| 链路宽度 | 通道数 | 典型应用场景 |
|---|---|---|
| x1 | 1 | 网卡、WiFi模块、低速外设 |
| x2 | 2 | 某些SSD、嵌入式设备 |
| x4 | 4 | NVMe SSD、RAID卡 |
| x8 | 8 | GPU(中端)、高性能网卡 |
| x16 | 16 | GPU(旗舰)、加速卡 |
这里有个坑,我提醒一下:物理上插了x16的卡,不代表就跑在x16上。我遇到过好几次,客户说“我显卡插好了怎么性能不对”,一查,跑在x4上。为什么?因为插槽的电气连接可能只接了x4,或者BIOS里做了限制。
lspci -vvv 可以看到当前链路宽度。如果显示“Width x4”,但你的卡是x16的,那就要查查硬件问题了。
2.2 链路速率:Gen1到Gen6
链路速率,就是每个通道每秒能传多少比特。每一代都在翻倍:
| 代际 | 速率(GT/s) | 编码方式 | 有效带宽(x1) | 有效带宽(x16) |
|---|---|---|---|---|
| Gen1 | 2.5 | 8b/10b | 250 MB/s | 4 GB/s |
| Gen2 | 5.0 | 8b/10b | 500 MB/s | 8 GB/s |
| Gen3 | 8.0 | 128b/130b | ~985 MB/s | ~15.75 GB/s |
| Gen4 | 16.0 | 128b/130b | ~1.97 GB/s | ~31.5 GB/s |
| Gen5 | 32.0 | 128b/130b | ~3.94 GB/s | ~63 GB/s |
| Gen6 | 64.0 | 1b/1b(PAM4) | ~8 GB/s | ~128 GB/s |
注意看编码方式。Gen1和Gen2用的是8b/10b编码,说白了就是每传8位数据,实际要发10位,20%的开销。从Gen3开始改用128b/130b,开销只有1.5%左右。所以Gen3虽然速率只从5GT/s跳到8GT/s,但有效带宽翻倍还多。
我个人习惯,做带宽估算时直接用这个公式:
有效带宽 = 链路速率(GT/s) × 链路宽度 × 编码效率
举个例子,Gen4 x4的NVMe SSD:
16 GT/s × 4 × (128/130) ≈ 7.88 GB/s
嗯,这就是为什么Gen4 SSD标称7.5GB/s左右,理论极限就在这儿。
2.3 链路协商过程
链路协商,就是PCIe设备上电后,主机和设备互相“握手”,确定双方都能接受的最高配置。这个过程叫LTSSM(Link Training and Status State Machine)。
我简单说说几个关键状态:
- Detect:检测对面有没有设备。说白了就是看看有没有东西插着。
- Polling:尝试建立连接,交换训练序列。
- Configuration:协商链路宽度和速率。这里有个细节——宽度协商是从高到低的。比如x16的卡,先尝试x16,如果对面只支持x8,就降到x8。
- L0:正常工作状态。数据开始传输。
- Recovery:如果链路出错了,尝试重新训练。我遇到过因为信号质量差,链路反复进入Recovery,性能直接崩了。
我曾经在一个项目中,板卡插上去总是协商到Gen2,明明两边都支持Gen3。查了半天,发现是PCB走线太长,信号衰减太大。后来在BIOS里把Gen3的TX EQ(发送均衡)参数调了一下,才稳定在Gen3。所以啊,链路协商不是“能跑多快就跑多快”,而是“能稳定跑多快就跑多快”。
2.4 实际项目中的避坑指南
我总结几个常见问题,你遇到了可以少走弯路:
- 链路宽度不对:检查物理连接,检查BIOS设置,检查PCIe槽位是否共享带宽(有些主板x16槽和M.2槽共享带宽)。
- 链路速率上不去:检查信号完整性,检查参考时钟质量,检查TX EQ设置。我曾经因为一个电容焊错了,Gen3死活上不去。
- 链路反复训练:检查电源稳定性,检查热插拔控制逻辑。PCIe热插拔的时序要求很严格,稍微不对就会导致链路断开。
lspci -vvv | grep -E "Width|Speed" 快速查看当前链路状态。如果显示“Speed 8GT/s”但“Width x4”,那就是Gen3 x4。如果显示“Speed unknown”,那链路可能根本没起来。
好了,链路配置这块就聊到这儿。下一章咱们聊聊TLP(事务层包)的结构,那才是真正理解PCIe数据传输的关键。你想想看,链路配置只是“路”修好了,数据怎么在“路”上跑,才是核心。