169、数据长度扩展协商未生效的链路层核查 一个让人抓狂的吞吐量断崖前两年做一款工业采集网关的迭代,硬件平台从上一代换到了新一代,主控和协处理器之间的高速互联链路也跟着升级。软件上我们有个改动,想把链路上单次传输的有效载荷从原来的小包模式切换到扩展长度模式,理论带宽能翻好几倍。配置写进去,寄存器也按手册配了,链路能通,数据能收发,看起来一切正常。但压测的时候出问题了。大块数据连续传输时,吞吐量卡在一个明显偏低的数值上,怎么调上层缓冲、DMA描述符深度、中断合并参数都突破不了。更诡异的是,小包场景下延迟和吞吐都正常,只有大包连续流才暴露瓶颈。用抓包工具看链路层,发现每个数据帧的长度字段确实变大了,但实际总线上两个帧之间的间隔时间并没有按预期缩短——链路层好像在“等”什么。这个问题折腾了将近两周,最后定位到的根因是:链路两端的数据长度扩展协商根本没有真正生效,一端以为自己开了扩展模式,另一端还在按旧模式工作,双方靠协议里的兼容机制勉强通信,但每次传输都在做无谓的拆分和重组。协商未生效的隐蔽性从何而来这类问题的麻烦之处在于,它不会导致链路完全不通。链路训练能过,链路层握手能过,甚至小数据量测试也能过。只有在大包连续传输、带宽压力上来之后,症状才显现。为什么协商失败还能通?因为很多高速链路协议在设计时考虑了向后兼容。如果一端不支持扩展长度,或者协商没谈拢,协议会回退到基础长度模式。回退过程通常是静默的,不会报错,不会中断链路,甚至不会在状态寄存器里留下明显的异常标志。你看到的是“链路正常”,但性能已经打了折扣。更隐蔽的是,协商未生效可能发生在多个层面。物理层链路训练阶段可能已经交换了能力信息,但链路层初始化时没有正确读取或应用这