服务器专题 | 第13期:链路是谈出来的:开机几秒谈什么
一张 PCIe 卡的盒子上印着 Gen4 x16,插进机器,跑出来的却可能是 Gen3 x8。遇到这种事,先别急着怀疑卡是假的,也别急着换槽位。很大概率上,链路两端在开机那几秒已经谈过一轮,谈成的就是这个结果。PCIe 的链路不是插上就按最高规格通电,而是一步步谈出来的,谈判的机器叫链路训练与状态机(LTSSM)¹。
谈判分几步走,顺序是写死的。Detect 先确认对面有没有设备,靠电气信号感知;Polling 交换训练序列,把时钟对齐、把位锁定;Configuration 谈宽度和速率,给每条通道编号;谈成了,进 L0,正常传数据;传着传着出错、失锁,就退回 Recovery,重新同步,实在稳不住就降速、降宽再谈²。整个过程不需要操作系统插手,硬件自己在物理层完成。验收时看铭牌没有用,要看谈判结果:链路状态寄存器里的协商宽度(Negotiated Link Width)和当前速率(Current Link Speed),才是这条链路真实的样子³。
谈判桌上只认交集:两边都有的才算数
谈判的第一条规矩,是取交集。根端口支持 Gen3 x8,端点只支持 Gen2 x4,谈成的就是 Gen2 x4³。不是取高的一方,也不是取低的一方迁就,而是两边能力清单重叠的那一块。反过来也一样:卡支持 Gen5,槽位只到 Gen4,链路就按 Gen4 跑,多的能力放着不用。这条规矩解释了很多"缩水"现场:卡没坏,槽位没坏,只是两边的交集本来就这么大。
| 代际 | 每通道速率 |
|---|---|
| Gen1 | 2.5 GT/s |
| Gen2 | 5 GT/s |
| Gen3 | 8 GT/s |
| Gen4 | 16 GT/s |
| Gen5 | 32 GT/s |
| Gen6 | 64 GT/s |
每代 PCIe 每通道的标称速率,代代翻倍。标称值是谈判的起点,不是到手带宽(数据来源:PCI-SIG 各代规格整理;示意图为程序绘制)
图注:每代 PCIe 每通道的标称速率,代代翻倍。标称值是谈判的起点,不是到手带宽(数据来源:PCI-SIG 各代规格整理;示意图为程序绘制)
交集之外,还有第二条规矩:信号质量有一票否决权。Gen3 往上,速率一上去,均衡就成了谈判的一部分。Teledyne LeCroy 对 PCIe 3.0 训练过程的拆解写得很具体²:链路先在 2.5 GT/s 起步,上游把一个发送端均衡预设值发给下游,下游跳到 8 GT/s 之后,再分四个阶段(Phase 0 到 Phase 3)互相调发送端系数、接收端连续时间线性均衡(CTLE)和判决反馈均衡(DFE),直到误码率落在可接受范围。调不拢,谈判不会硬撑,Recovery 会把速率降一档再试。降速不是故障,是链路在保连接不断的前提下做的让步。能跑 Gen3 x4 的卡,降到 Gen2 x8 也许总带宽差不多,但延迟和单通道行为已经变了,账要按谈成的结果重算。
LTSSM 的谈判路径:Detect、Polling、Configuration,一路谈到 L0;出错失锁退回 Recovery,重新同步,稳不住就降速降宽(示意图为程序绘制)
验收只看三行:速率、宽度、纠错计数
落到买方验收,这套谈判机制给了一张很具体的体检表。开机进系统,查三行就够。第一行,协商速率是不是两边交集里的最高档;第二行,协商宽度是不是插满的通道数,x16 的卡谈成 x8,先查转接卡、延长线和槽位本身是不是只给了 x8;第三行,运行一段时间后的纠错计数有没有持续增长——计数一直在涨,说明链路在勉强维持,Recovery 在反复救场,今天能用不代表明天稳定。
这张表还有一层意思:布线和连接器也是谈判桌上的一方。通道走线太长、过孔太多、转接层次太多,信号到对面已经糊了,均衡再调也救不回来,谈判结果就是降速降宽。L3 布线那期讲过,线束决定稳定性,这里是同一件事在物理层的回响。验收时把"谈成了什么"记下来,比把"标称是什么"记下来有用得多:前者是这台机器当下的真实能力,后者只是盒子上的印刷字。
以小见大的一层判断:服务器里很多"性能问题",根子不在算力,而在协商。CPU、GPU、网卡、存储各自的铭牌都很好看,真正决定整机表现的,是它们两两之间谈成了什么。谈判机制的存在,本身就是一种工程诚实:系统不假装每条链路都跑满,而是把真实能力谈出来、写进寄存器,让买方有据可查。看不懂谈判结果的人,只能按铭牌买单;看得懂的人,按谈成的结果验收。
没完全想通、留下一个问题:同一条链路在空载时谈成满速、满载发热后悄悄降速,这种随温度和负载漂移的谈判结果,验收时的一次快照抓不抓得住?公开资料里谈得多的是开机训练,运行中的重谈判行为,值得再找实测对照。
觉 然 小 注
插上不等于谈成,谈成不等于跑满。铭牌是愿望,寄存器里的那两行,才是现实。
· · ·
九羲科技|服务器 · 私有 AI · 存力方案
系列目录
第1期 | 73% 的整机钱,都给了 GPU 板组
第2期 | 4500 颗芯片撑起 95% 的机架价值
第3期 | 拆一台 2U 双路:通用服务器的钱花在哪
第4期 | 大铁盒子,值钱的不是铁
第5期 | 冻结点:L5 之后结构不许再改
第6期 | 能点亮不等于能交付:十二层验什么
第7期 | 内存离 CPU 有多远:NUMA 的延迟税
第8期 | 带宽不是买速度,是买并行度
第9期 | 一颗坏芯片,怎样不拖垮整机
第10期 | 数据上台三步,每步都在花时间
第11期 | CXL 内存慢一档,为什么还值得买
第12期 | 存力只在关键路径上才算数
引用与出处
[1] Congatec. PCIe Link Configuration at Runtime(AN38). congatec.com. <a href="https://www.congatec.com/support/application-notes/article/an38-pcie-link-configuration-at-runtime/">https://www.congatec.com/support/application-notes/article/an38-pcie-link-configuration-at-runtime/</a>
[2] Teledyne LeCroy. An Under-the-Hood View of PCIe 3.0 Link Training(Part I). blog.teledynelecroy.com, 2014. <a href="https://blog.teledynelecroy.com/2014/11/an-under-hood-view-of-pcie-30-link.html?m=1">https://blog.teledynelecroy.com/2014/11/an-under-hood-view-of-pcie-30-link.html?m=1</a>
[3] Intel. Debugging Link Training Issues. intel.com. <a href="https://www.intel.com/content/www/us/en/docs/programmable/683140/24-1-12-0-0/debugging-link-training-issues.html">https://www.intel.com/content/www/us/en/docs/programmable/683140/24-1-12-0-0/debugging-link-training-issues.html</a>
下一篇|第14期:四电平挤带宽:SerDes在替谁赎买 —— PAM4、FEC 与均衡,怎样把糊掉的信号再捞回来。