






















今天要来读《Uno: A One-Stop Solution for Inter- and Intra-Data Center Congestion Control and Reliable Connectivity》这篇论文。本文是阅读过程中的杂记。
Tommaso Bonato, Sepehr Abdous, Abdul Kabbani, Ahmad Ghalayini, Nadeen Gebara, Terry Lam, Anup Agarwal, Tiancheng Chen, Zhuolong Yu, Konstantin Taranov, Mahmoud Elhaddad, Daniele De Sensi, Soudeh Ghorbani, and Torsten Hoefler. 2025. Uno: A One-Stop Solution for Inter- and IntraData Center Congestion Control and Reliable Connectivity. In The International Conference for High Performance Computing, Networking, Storage and Analysis (SC ’25), November 16–21, 2025, St Louis, MO, USA. ACM, New York, NY, USA, 16 pages. https://doi.org/10.1145/3712285.3759884
云计算与AI推理既需要数据中心内通信又需要跨数据中心通信,但是数据中心内和跨数据中心网络的延迟差异巨大,让两者的通信瓶颈为带宽而不是路由(我们更希望让带宽被打满)所需的消息大小也不同。当前,数据中心内与跨数据中心的拥塞控制都是分别的模块在负责,Uno提出了一个统一系统处理这两种情况下的拥塞控制及路由。

intra是DC内,inter是DC间
inter流延迟高,拥塞信息传回慢,intra流相反,难以知道实际情况
BDP表示在飞的数据包,intra更小,inter更大。这对于缓存区浅的交换机来说是个挑战,因为它的缓存队列不足以容纳突发流量。
丢包信息需要一个RTT才能传回来,重传代价很高。BBR为WAN设计,没有考虑数据中心内的网络,Gemini用同一套滑动窗口处理inter和intra收敛慢
“Uno, a system that tightly integrates congestion control, load balancing, and loss resiliency to create a unified solution for both intra- and inter-DC communication” Uno,一个紧密集成了拥塞控制、负载平衡和损失恢复能力的系统,为数据中心内部和数据中心之间的通信提供统一的解决方案

Uno由UnoCC和UnoRC组成。
UnoCC的设计很巧妙,主要用在大消息,带宽为瓶颈的情况下。使用了幽灵队列实现用ECN统一控制inter和intra流量
UnoRC在“大部分瓶颈是延迟”的设定上,用纠错包以额外带宽开销为代价减少重传,并使用UnoLB故意把一个流拆成几个子流分散到不同的路径,因为有冗余包,可以在接收端恢复。无法恢复再发NACK
这一块的关键设计有以下的ai总结:


UnoCC将网络情况区分为三种:
AIMD(加性增,乘性减),需要注意的是公式如下:
$$cwnd = cwnd + \alpha \times \frac{bytes\_acked}{cwnd}$$
也就是说不是像tcp那样一个rtt增加一个mss,而是把一个mss切成了很多份。
包是连续发的,所以对于一个rtt内那个窗口发的包,其对应的ack会在相邻时间内传回来,每收一个ack,窗口增大一点。
$\alpha$ 应被设定为BDP的一部分,比如$0.001\times BDP$ $\alpha$ 应随队列长度和网络能支持的incast程度而缩放
MD阶段,每个epoch最多触发一次,这是为了防止一看到ECN就减速
AI(加性增)是每收到一个ACK就立即执行一次小额窗口增长的。但MD不能这样——不能一看到带ECN标记的ACK就立刻砍窗口。原因有二:
因此,UnoCC引入Epoch(纪元)机制:在一个Epoch持续期间,只收集所有ACK中的ECN信息,不做任何降速决策;等到Epoch结束时,再根据整个Epoch内的汇总信息,做最多一次MD降速。
Epoch的边界由两个关键时间戳定义:
Epoch生命周期:
直觉理解:$epoch\_period$约等于一个RTT。设计保证了每个Epoch大致覆盖一个"发送-反馈"的完整周期,有足够多的包被确认,从而能做出有统计意义的拥塞判断。
判定规则非常直接:
如果在一个Epoch中,有任何一个ACK携带了ECN标记,这个Epoch就被判定为"拥塞的"。
这意味着UnoCC对拥塞信号足够敏感——哪怕只有少量包被标记,也认为网络有压力,应该考虑减速。
当Epoch被判定为拥塞后,核心是计算降速比例。UnoCC不是简单地砍半,而是用了一个与环境适配的多因子公式。
降速执行: $cwnd = cwnd \times (1 - MD_{ECN})$
$MD_{ECN}$的计算:
$$MD_{ECN} = \mathcal{E} \times \left(\frac{4 \times K}{K + BDP}\right)$$
其中两个关键变量:
① $\mathcal{E}$:拥塞热度的指数加权移动平均(EWMA)
$\mathcal{E}$是UnoCC的"拥塞体温计"。它不是看当前这一个Epoch的ECN比例,而是对**横跨多个Epoch的ECN标记比例**做了平滑处理。
更新规则(每个Epoch结束时执行一次):
$$\mathcal{E}_{new} = (1 - g) \times \mathcal{E}_{old} + g \times F_{current}$$
其中:
为什么需要$\mathcal{E}$?
② $\left(\frac{4 \times K}{K + BDP}\right)$:网络规模适配因子
自适应效果:
幽灵队列的ECN信号可能来自虚拟水位而非真实物理排队。如果物理队列实际是空的,大幅降速会造成不必要的带宽浪费。
UnoCC通过测量相对延迟来区分:
$$delay = RTT - RTT_{base}$$
判断逻辑:
1 | 在每个Epoch结束时: |
执行真正的降速:
$$cwnd = cwnd \times (1 - MD_{ECN} \times MDscale)$$
1 |
|
QA — Quick Adapt(快速适应),应对MD反应过慢的极端拥塞场景。
MD(乘性减少)虽然能根据拥塞热度平滑降速,但有一个根本局限:当网络遭遇急剧的容量塌陷时,MD的反应速度跟不上。
典型触发场景包括:
在这些事件中,物理队列或幽灵队列的水位瞬间飙升,丢包风险极高。如果仍让MD每个Epoch平滑地砍一点窗口,等到窗口降到安全水平时,网络可能已经经历了长时间的严重拥塞和大幅延迟增加。
QA的设计目标就是:一旦检测到这类网络容量的断崖式下跌,立即将发送窗口砍到当前网络实际能承受的水平,然后给网络一个冷静期。
UnoCC每隔一个RTT执行一次QA检查。判断依据非常直观:
如果在这个RTT内,被确认的字节数远低于预期,说明网络极度拥塞。
形式化:
$$bytes\_acked\_in\_qa < cwnd \times \beta$$
直觉理解:在无拥塞的正常情况下,一个RTT内应该能确认大约一整个窗口的数据量(因为窗口大小等于链路上的在途数据)。如果实际只确认了很少,这意味着包在路上遭遇了严重排队或丢包,网络已经远超轻度拥塞。
一旦触发QA,UnoCC直接执行"紧急刹车":
$$cwnd = bytes\_acked\_in\_qa$$
为什么这样做合理?
bytes_acked_in_qa就代表了网络此刻真实能消化的数据量。QA是非常激进的操作。为了防止对短时波动过度反应,导致窗口刚砍下去又被AI慢速爬坡拖累,UnoCC在QA触发后引入一个强制冷却期:
触发QA之后,跳过接下来的一个完整RTT,在此期间不触发任何QA或MD。
这个设计的效果:
bytes_acked依然偏低而再次触发QA,造成窗口连续被踩到底。1 |
|
QA只在最恶劣的瞬态冲击下启动。正常情况下网络运行在AI和MD的循环中,只有当MD来不及反应时,QA才介入做一次"硬着陆"。之后经过一个RTT的冷静期,拥塞控制平稳交还给AI/MD,让其从新的实际速率开始重新爬坡。这种分层设计让UnoCC既能保持日常运行的高效和平滑,又能在极端事件中快速自救。
如§2所分析的,在同时存在intra-DC和inter-DC流量的场景下,高效设置ECN标记阈值面临两难:
如果按intra-DC的标准设置ECN阈值,inter-DC大流会瞬间撑爆浅缓冲;如果按inter-DC的标准设置,intra-DC的拥塞检测将极度迟钝。若所有地方都使用浅缓冲,又会导致现代拥塞控制算法在面对大BDP时产生剧烈震荡。
幽灵队列的核心思想是:用一个虚拟计数器来替代物理队列做ECN标记决策,从而将拥塞检测与物理缓冲容量解耦。
幽灵队列是一个在交换机上维护的简单计数器,不需要任何实际的包存储空间:
论文中建议的排水速率设置为物理队列排水速率(即链路带宽)的约90%,即比物理链路慢约10%。
$$drain\_rate_{phantom} = 0.9 \times drain\_rate_{physical}$$
稳态下的行为:
在正常运行的稳态下,幽灵队列的排水速率低于物理队列。这意味着:
关键效果:
由于物理队列在稳态下几乎为空,延迟敏感的intra-DC小流的数据包到达交换机时可以直通,排队延迟接近零。这为小流创造了额外的"带宽净空",使其不受大流突发的挤压。
幽灵队列的提前预警可能让大流过早减速,存在"惩罚"吞吐量密集型大流的风险。论文给出的解决方案是精细调节排水速率:
幽灵队列标记ECN,UnoCC在收到ECN信号后,通过MDscale机制(见MD章节)区分拥塞来源:
这种双层配合保证了幽灵队列的预警功能不会导致不必要的过度降速。
先不写了,UnoCC急着要完成
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。