找到研究场景,确定研究问题,然后在环境里做减法,减到每个机制都是必要的,且动机可查——这是要费大力气去想的。
ATC25:Towards Optimal Rack-scale µs-level CPU Scheduling through In-Network Workload Shaping
论文检索来自gemini
总览
随着云端微服务和高频实时应用的普及,微秒级服务对系统调度延迟和资源利用提出了极高要求。论文提出了一种新型机架级调度系统——Pallas,用于高效调度微秒级请求。该系统创新性地引入“网络内工作负载整形(in-network workload shaping)”的理念,利用可编程交换机主动将混合请求划分为同质请求组,并在交换机中完成分组调度,从而在根本上避免服务器侧的请求堵塞问题(Head-of-line Blocking)。随后,Pallas对这些同质请求执行组内负载均衡,并在服务器端采用简单的集中式FCFS调度,实现近乎最优的尾延迟。为了适应动态负载变化和突发流量,Pallas还设计了请求回弹(request bouncing)机制以平滑策略切换过程中的性能波动,并提出无悔(no-regret)的请求克隆策略,在局部过载时将请求复制至低负载组,从而屏蔽瞬时尖峰带来的尾延迟膨胀。
背景
机架级调度(rack-scale scheduling)典型代表是 RackSched(本文重点比较对象),它通过可编程交换机进行跨服务器负载均衡,并在服务器内使用如 Shinjuku 等数据平面操作系统进行调度。
- RackSched 存在两个关键问题
- 负载不均衡:其基于最短队列(JSQ)的负载均衡方法不感知请求的具体执行时间,导致服务器间负载不均。
- 队头阻塞(HoL blocking):由于请求类型混杂(长短请求混合),服务器内部即使使用高级调度算法也难以避免队头阻塞,导致尾延迟显著增加。
- Pallas关键架构(三层调度)
- 工作负载整形(ToR 交换机):根据请求类型及其历史执行时间,将请求划分到不同分组,确保组内请求的 CPU 需求高度一致。
- 组内负载均衡(ToR 交换机):采用加权轮询(WRR)将请求均匀分发到组内服务器。
- 服务器内调度(服务器端):对同质化请求使用简单的集中式 FCFS(cFCFS),对于少数混合服务器使用 DARC 调度。
论文观察到:同质化的工作负载在单服务器上易于调度
Pallas 的核心机制是在交换机上主动把请求分流到不同的服务器组,这要求请求在服务器之间可以灵活调度,不受数据所在位置的限制
本文限定场景
可以看到限定非常之细。
往往新人总是喜欢 “大一统、all in one、异构容错全加上”,反正要是搁我亲和性绝对放进去的(Pallas说没放亲和性是因为RackSched已经做了,迁移就好),不就是个字段吗,但Pallas没有
- 范围
- 单机架:仅一个ToR交换机,不涉及ToR交换机之间的交互
- 调度何种任务
- CPU 密集型任务,没有异构的事情。在 §7 Discussion 提到当前的“同构整形”只考虑了 CPU,未考虑内存、I/O 等资源。如果要在异构环境下达到更高吞吐量,需要将 多维资源特征 纳入分组依据。
- 实时性 要求极高的任务,而不是离线任务。请求混合长短执行时间。依赖请求类型与执行时间的强相关性,不适用于执行时间高度不可预测的工作负载。
- 任务必须是 无状态 的,例如只读查询。Pallas不能根据包解析数据位置。论文在 §7 Discussion 中简短提及了扩展方向,即添加一个跟type类似的字段,交换机根据这个字段做“亲和性转发”。
- 任务封装
- 单包请求:任务的代码是预先部署在每台服务器的 CPU 上的,不携带大量代码
- 类型用一个8位的type字段不多:实验包括 RocksDB(2 种请求)、TPC-C(5 种)、合成负载(2-3 种),因此 8-bit Type 绰绰有余
- 任务发起者填type字段
-
存在微秒级突发
Q & A
- 论文是机架级、服务器间的范围设计的,与服务器内调度器是如何协同的
- 理解 Pallas 的协同,最好的参照是 RackSched 的失败经验:
| 维度 | RackSched | Pallas |
|---|---|---|
| 协同信息 | 服务器将实时队列长度上报给交换机(有延迟) | 控制平面下发静态策略(Type→Group 和调度算法) |
| 交换机决策 | 基于过时的队列长度做 JSQ 负载均衡 | 基于预配置的权重表做 WRR 负载均衡 |
| 服务器责任 | 使用复杂算法(如 Shinjuku/DARC)处理混合负载 | 大部分服务器用 cFCFS 处理同质化负载 |
| 协同性质 | 反馈式:依赖实时的、可能过时的状态 | 前馈式:依赖预先规划的策略和请求类型 |
- 如何生成有效的调度策略?
- 使用改进的 k-means 聚类生成候选分组策略,再通过离线微基准测试选择最优策略,平衡组内同质性与系统利用率。
- 请求回弹机制是什么
- 在策略切换时优先处理短请求,避免队头阻塞。
- 请求克隆机制是什么
- 处理突发。当某个服务组(Group)在极短时间内收到的请求数量超过其处理能力时,交换机主动将部分请求复制一份,转发到其他负载较低的服务组去处理,以分摊压力、降低尾延迟。并过滤冗余响应,保证“无悔”性能。
- 为什么Pallas没做资源感知
- 在 §4.2 解释了原因
- 延迟太大:如果交换机要实时感知服务器负载,需要服务器每 10μs 上报一次状态。网络延迟(RTT)远大于微秒级服务本身的执行时间,等交换机收到“忙”的信号时,服务器可能早就空闲了。
- 避免决策错误:RackSched 因为依赖这种过时的实时负载信息导致了严重的负载不均( Figure 2a)。Pallas 索性放弃实时感知,转向确定性更强的静态权重分配。
- 为什么做“在网”整形,上控制面不行吗?
- 当任务只有几微秒时,任何基于“询问-答复”的调度方案在物理逻辑上都失效了。
- 交换机基于的是服务器 2微秒之前的状态做决策。在微秒级高并发环境下,这段时间里服务器可能早就被别的包塞满了。
- 因此pallas 不再依赖反馈。在交换机这就把流量按类型“整形”好,前馈(Feed-forward)地发出去。在信息还没“凉”之前就把动作做完。