IT 论文精读 · PAPER 59

Borg:把一栋机房当一台机器

Verma, Pedrosa, Korupolu, Oppenheimer, Tune, Wilkes · Google · EuroSys 2015

EN →

这篇论文干了什么?

2015 年,Google 第一次系统地公开了 Borg——一套已在它内部默默跑了十几年的系统,Google 几乎所有程序(搜索、Gmail、广告、数据分析)都由它安排在哪台机器上运行;今天广为人知的 Kubernetes,就是照着 Borg 的思路重写并开源的产物。

Borg 干的事一句话说得清:把一栋机房里成千上万台机器,当成一台巨大的机器来分配。你不再说「我要 3 号机和 7 号机」,只说「我要跑 500 份这个程序、每份大概要这么多算力和内存」。

旧世界有多浪费

在 Borg 之前(今天很多公司仍然如此):每个团队圈一批属于自己的机器。麻烦有两层:每批都得按最忙的那一刻来买,于是平时大半时间闲着;而且互不借用——广告那批机器半夜闲得发慌,隔壁排队等算力的报表任务也用不上它。

打个比方:一栋写字楼给每家公司分死一层楼,谁都不许用别家的会议室。于是每层都得按「全员开大会」的规模留出会议室——可全员大会一年只开两次。

点子:把两种脾气相反的活混着放

机器上跑的活分两类,脾气正相反。在线服务(网页搜索、邮箱)得一直开着,慢一点用户立刻有感觉,但忙闲随时段大幅起伏;批处理(跑数据、算报表)一次跑几分钟到几小时、跑完就散,慢一点没人在乎,大不了重跑。

Borg 的核心就是:把这两类活混在同一批机器上跑,让批处理去吃掉在线服务此刻没用上的那部分。回到写字楼的比方:会议室不再分死,谁要用谁登记;但开会分等级——真有客户来了,正在里面开内部脑暴的那伙人得腾地方。

那它怎么保证在线服务不被拖累?

第一,排优先级。机器紧张时,Borg 直接把低优先级的活踢下去、把位置腾给高优先级的;被踢掉的批处理排队等下一轮——反正它能从头重跑。

第二,盯着真实用量,把没用上的收回来。工程师申请资源时几乎总是往多了要,怕不够。Borg 不太信这个数字,它一直观察你实际用了多少,在申请额和实际用量之间划一条带安全余量的线,中间那截空的转手借给批处理;等你用量真涨上来,再把借出去的收回。

第三,机器坏了它自己补。上万台机器每天都有坏的。Borg 一直听着每台机器的心跳,某台失联,上面的活自动在别处重开。

带来了什么

Google 自己算过账:如果把在线服务和批处理拆到不同机器上分开放,中位规模的机房要多买两到三成的机器。更深远的是它定下了一种做法:你只描述你要什么,不指定它在哪儿跑——今天几乎所有的云、所有 Kubernetes 集群用的都是这个思路。诚实说一句代价:这份便宜是批处理任务用「随时可能被踢掉」换来的,写这类程序必须能忍受跑到一半被杀、从头再来。

一句话记住

把整栋机房当一台机器:你只说要什么、不说在哪跑;在线服务与批处理混装在同一批机器上,靠「优先级抢占」和「回收你申请了却没用的额度」把利用率榨上去,机器坏了自动补——省下两三成机器,也定义了后来 Kubernetes 的样子。

想看 Borg 的架构图、调度器怎么在上万台机器里挑一台、以及那些实测数字? → 切到精读版