Meta Rebalancer 展示了怎样用稳定合同连接业务策略、数学表达、求解器和调试工具。这套经验并不局限于数据中心:先定义对象、容器、目标、约束和验收规则,再选择算法。只有团队能说清什么叫有效分配,并能解释系统为什么给出某个结果,求解速度才真正有价值。
阅读时间:约 9 分钟 · 约 2900 字
TL;DR
- 把业务政策放在与求解器无关的规格层,避免与某个算法绑定。
- 分开硬约束和优化目标,让有效与更优保持不同语义。
- 将规格编译为共享表达式图,供不同求解器和调试工具复用。
- 规模允许时用 MIP 获取最优解或基线,大规模限时决策用局部搜索。
- 把初始约束违例视为显式修复任务,并用独立检查器验收最终分配。
Rebalancer 是一套架构,不是一种聪明算法
Meta 在内部使用和改进 Rebalancer 超过九年后,于 2026 年 9 月 21 日将其开源。它处理一种反复出现的分配问题:把对象放入容器,在满足约束的同时优化目标。
在 Meta 内部,同一种问题形状出现在硬件布局、服务放置、任务调度、流量路由、数据迁移和机器学习工作负载分配中。领域名词不断变化,控制问题保持相似。
Rebalancer 的核心设计是职责分离:
- 领域问题怎样描述;
- 问题怎样在内存中紧凑表示;
- 使用什么方法求解;
- 怎样理解和调试求解器行为。
配套的 OSDI 2024 论文把易用性和可扩展性列为通用资源分配框架的两项主要障碍。领域工程师很难把现实政策翻译成数学表达,大规模 NP-hard 问题又会超出通用最优求解器的实际能力。可复用系统必须同时处理这两点,同时保持政策和实现解耦。
从与求解器无关的政策模型开始
Rebalancer 先定义对象和容器,再增加一组小型领域词汇:
| 构造 | 含义 | 示例 |
|---|---|---|
| Object | 必须分配的对象 | task、shard、server |
| Bin 或 container | 对象的目的地 | host、rack、service |
| Dimension | 数值属性 | CPU、内存、功率 |
| Partition | 对象分组 | 属于同一作业的任务 |
| Scope | 容器分组 | 同一机架中的服务器 |
| Utilization | 已分配对象的贡献 | 主机上的内存总量 |
在这些基础构造上,可复用 Spec 表达常见目标和规则。Capacity 约束可以限制每台主机的内存。Balance 目标可以降低利用率偏差。Group Count 规则可以限制一个机架上出现多少种作业。
这种结构可以解除一种高成本耦合。如果业务政策只存在于局部搜索循环的过程代码里,更换算法时就可能同时改变政策含义。新的审阅者也只能从 Move 逻辑中反向猜测设计意图。
与求解器无关的合同让团队分别回答两个问题:
- 我们是否准确建模了预期政策?
- 当前求解器是否为这套模型生成了可接受答案?
第一个问题属于领域负责人,第二个问题属于优化与系统工程。双方可以独立演进,并共享一套测试样例。
分开硬约束与优化目标
约束定义系统可以接受哪些分配,目标负责在可接受集合中排序。混在一起后,系统可能为了更高分数牺牲容量或安全规则。
以把任务分配到主机为例:
- 主机内存容量是一条约束。
- 副本分散到不同机架也可能是一条约束。
- CPU 负载均衡可以是优化目标。
- 最小化迁移成本可以是另一个目标。
冲突政策必须显式。两条硬约束无法同时满足时,求解器应该返回带证据的不可行或待修复状态。把其中一条静默变成软惩罚,等于把政策决定藏进优化器内部。
Rebalancer 接受一份初始分配。Meta 的说明称,优化结果不能违反新增约束。初始状态已经违反的约束会成为高优先级目标,系统尽量把违例降到零。这可以看作一种修复模式,但结果需要严格报告。
修复后的分配至少要说明:
- 运行前存在哪些违例;
- 哪些违例已经消除;
- 哪些仍然存在,幅度多大;
- 修复牺牲了多少目标质量;
- 最终结果是否具备生产可用资格。
这才是目标、约束与修复分离的准确含义。修复是一段状态转换和证据记录,而不是静默混进分数里的第三类政策。
先编译成共享表达式图
Rebalancer 把规格转换为有向无环表达式图。叶节点代表利用率等基础值,上层节点通过 Sum、Max、Square 和 Abs 等操作继续组合。对象在容器间移动时,图中数值也随之变化。
表达式图是一层中间表示,让不同消费者共享同一语义:
- 局部搜索可以评估一次移动怎样改变约束和目标;
- MIP 翻译器可以为外部求解器生成数学模型;
- 剪枝和等价性分析可以减少搜索工作;
- 调试工具可以解释哪些表达式主导最终结果。
这很像编译器架构。领域政策是源语言,表达式图是中间表示,局部搜索与 MIP 是后端,Explorer 则是检查界面。
这个类比也给出了测试方法:优化之前验证规格,在小规模分配上检查表达式图计算结果,在可解实例上比较不同求解器,再用独立验证器检查最终分配是否满足约束。
先说明取舍,再选择求解器
Rebalancer 主要提供两类求解路径。
混合整数规划 MIP 会把表达式图转换为 FICO Xpress、Gurobi 或开源 HiGHS 可以处理的模型。在时间充足时,它可以给出最优解。对象与容器之间的选择会制造大量决策变量,导致模型快速膨胀。Meta 使用变量聚合、可交换性和对称性破除降低规模,但最大问题仍超出 MIP 的实际承载范围。
局部搜索 从现有分配出发,探索移动单个对象、交换对象等邻域操作。它持续接受有效且改善目标的移动,直到无法继续进步,或达到时间与步数上限。Meta 的开源仓库明确给出边界:局部搜索扩展性更好,但不保证全局最优。
因此,真正的问题并不是哪种求解器最好,而是当前决策需要什么证据:
| 场景 | 合适路径 |
|---|---|
| 小规模且最优性重要 | MIP,加最优性证明或 Gap |
| 大规模在线修复,有严格时间预算 | 局部搜索,加有效性和质量检查 |
| 新问题规格 | 先在缩小实例上建立 MIP 基线,再实现局部搜索 |
| 生产回归 | 固定样本集,在可行范围内同时运行两种求解器 |
OSDI 论文和 Meta 开源说明都展示了这种混合用法:最优求解可以建立基线或帮助调参,大规模生产负载通常依赖局部搜索。
调试会成为下一个瓶颈
框架让问题更容易描述和求解后,工程时间会转移到理解行为。OSDI 论文指出,模型接入过程中的大量工程工作集中在目标排序、约束冲突等调试问题上。
Meta 为此开发了 Rebalancer Explorer。开源 UI 可以检查对象、容器、约束和目标,并回答某个对象为什么进入某个容器、放宽一条约束会发生什么。
这是典型的瓶颈迁移。更快的搜索让团队可以更快尝试政策,新的限制因素变成如何区分求解器缺陷、规格错误、不可行政策和可接受取舍。
生产分配系统至少要能回答五个问题:
- 哪些约束正在限制结果?
- 哪些目标主导总分?
- 某个对象为什么移动到这个容器?
- 什么因素阻止了预期分配?
- 一项政策或数据变化会让结果发生多大变化?
普通日志往往只能记录执行细节,无法说明模型语义。解释工具应该和求解器消费同一份政策与表达式表示。
最小实现与验收模式
开源仓库提供 C++ 和 Python 接口。下面用与具体 API 无关的伪代码保留四个阶段:
solver = ProblemSolver(service_name="scheduler", service_scope="prod")
solver.set_assignment(current_assignment)
solver.add_object_dimension("memory", task_memory)
solver.add_container_dimension("memory", host_capacity)
solver.add_constraint(memory_capacity_spec)
solver.add_objective(cpu_balance_spec)
solver.add_solver(local_search_spec)
solution = solver.solve()
政策构造应与 solve() 调用分离。求解结束后,再使用不复用求解器内部计算路径的代码独立验收:
assert every_object_assigned_once(solution)
assert all_capacity_limits_hold(solution, host_capacity, task_memory)
assert required_failure_domain_spread_holds(solution)
assert objective_score(solution) <= production_threshold
上线前可以使用这份清单:
- 冻结一组代表性的有效、不可行和待修复初始分配。
- 写清全部硬约束、目标优先级、停止条件和允许残余违例。
- 在人工可计算的小样本上验证表达式值。
- 在 MIP 可承载的实例上对照局部搜索结果。
- 用独立检查器验证最终分配。
- 分别记录修复前后的违例。
- 明确确定性要求,或报告不同随机种子与线程数下的结果方差。
- 为质量、求解时间和无法解释的行为设置回滚规则。
生产门禁应同时要求分配有效、质量有界、延迟有界并且存在解释路径。违反政策的快速答案,与错过决策窗口的最优答案,都会让整个系统失败。
FAQ
Meta Rebalancer 解决什么问题?
它描述如何把对象分配到容器,在满足约束的同时优化目标。Meta 把这种问题用于基础设施放置、流量、迁移和其他资源分配任务。
Rebalancer 是一个 MIP 求解器吗?
它是一套更完整的规格与求解框架。它既能把模型转换给外部 MIP 求解器,也能使用自身的局部搜索实现。
局部搜索能找到最优分配吗?
局部搜索可以高效寻找有效的改善动作,但不提供通用的全局最优保证。应在小规模实例上与最优基线比较,并设置生产质量阈值。
硬约束和软目标应该怎样表示?
把它们保留为不同模型概念。硬约束定义可接受集合,目标负责在集合中排序。任何放宽都应显式、获得授权并写入报告。
初始状态无效时,求解器应该返回什么?
同时返回修复后的分配与违例报告,覆盖修复前状态、修复后状态、残余违例和生产可用资格。
先设计合同,再调优求解器
Rebalancer 最值得迁移的是架构。可复用分配系统为领域政策提供稳定语言,为算法提供共享中间表示,也为操作者提供解释界面。团队因此可以更换求解器,同时保持有效结果的语义不被静默改写。
选择一个现有分配服务,把对象、容器、硬约束、优化目标、停止条件和独立验收规则写在一页纸上。任何只存在于算法代码中的项目,都是第一批需要解耦的政策。