Serverless computing
serverless computing
什么是 Serverless Computing(无服务器计算)
Serverless Computing(无服务器计算)并不是指真的不需要服务器,而是一种云计算执行模型。在这种模型中,云服务商负责维护服务器的运行、硬件资源的分配、操作系统的维护、以及根据需求进行自动扩缩容,而开发者只需要关注编写代码和业务逻辑。
从架构上看,Serverless 通常由两个主要部分组成: 1. FaaS (Function as a Service,函数即服务):开发者编写一段函数代码并在事件触发(如 HTTP 请求、文件上传等)时运行。例如 AWS Lambda 或阿里云函数计算。 2. BaaS (Backend as a Service,后端即服务):第三方提供的后端服务,如云数据库、即时通讯、身份验证等。
核心特征
- 无需管理服务器:开发者不需要 SSH 到机器上,也不需要配置运行环境。
- 自动扩缩容 (Auto-scaling):根据请求量自动增加或减少资源,请求多时自动并发,请求归零时释放资源。
- 按需计费 (Pay-as-you-go):通常按照代码运行的时间和调用的次数计费。如果代码没运行,则不产生费用。
- 事件驱动:执行通常由特定的触发器引发。
相关结论与数理逻辑拓展
由于 Serverless 的核心优势在于资源分配与成本控制,我们可以通过一些简单的数学模型和逻辑结论来进一步理解其特性。
1. 成本函数的对比结论
设传统的云服务器(如 VPS)单位时间租赁费用为 \(C_v\),租用时长为 \(T\),总成本为 \(f(T) = C_v \cdot T\)。 设 Serverless 的单次调用成本为 \(c_s\),调用次数为 \(n\),执行时长为 \(t\),单位时长成本为 \(k_s\),则总成本为 \(g(n) = n \cdot (c_s + k_s \cdot t)\)。
结论 1 (经济性临界点): 当满足下式时,Serverless 具有经济优势: $\(n \cdot (c_s + k_s \cdot t) < C_v \cdot T\)$ 这意味着,对于低频执行(\(n\) 较小)或具有显著波峰波谷(流量不均匀)的业务,Serverless 的成本远低于传统服务器。但如果业务负载是恒定且极高的,传统服务器的“包月制”往往更具成本效益。
2. 冷启动逻辑 (The Cold Start Problem)
Serverless 存在“冷启动”现象,即当函数从零开始被调用时,系统需要初始化容器。
结论 2 (概率密度影响): 设某函数在时间段 \([0, T]\) 内被调用的概率服从参数为 \(\lambda\) 的泊松分布(Poisson process)。已知云服务商通常会在函数执行完后保留实例 \(t_{keep}\) 时间。 如果两次请求的间隔时间 \(X > t_{keep}\),则会发生冷启动。 根据指数分布(两次事件发生的间隔时间分布),发生冷启动的概率 \(P\) 为: $\(P(X > t_{keep}) = e^{-\lambda t_{keep}}\)$ 由此可见,请求频率 \(\lambda\) 越高,发生冷启动的概率越低。这也解释了为什么开发者会通过“预热(Warm-up)”策略(即定时发送心跳请求)来维持函数活跃。
3. 并行度与 Little's Law
Serverless 的伸缩性可以用排队论中的 Little's Law 进行定性分析: $\(L = \lambda W\)$ 其中: * \(L\) 是并发处理的请求数(系统内的资源占用)。 * \(\lambda\) 是单位时间内到达的平均请求率。 * \(W\) 是单个请求的平均处理时间。
结论 3 (弹性极限): 在传统架构中,\(L\) 受限于服务器的最大并发值 \(L_{max}\)。而在 Serverless 架构中,云服务商通过极大的弹性容量池,使得 \(L\) 可以跟随 \(\lambda\) 的增长而快速扩张。然而,开发者仍需关注后端的 BaaS 层(如数据库的连接池限制),因为函数的并发数 \(L\) 的爆发式增长可能会导致数据库连接数耗尽。
端到端延迟(End-to-End Latency) 是指一个数据包从发送端(Source)发出开始,到接收端(Destination)完全接收并处理该数据位为止所经历的总时间。
在初等网络理论中,端到端总延迟 \(D_{\text{total}}\) 通常由以下四个分量相加而成:
- 处理延迟 (\(d_{\text{proc}}\) - Processing Delay): 路由器或终端设备检查数据包首部、决定路由方向、检查位错误所用的时间。这取决于硬件的处理能力和算法效率。
- 排队延迟 (\(d_{\text{queue}}\) - Queuing Delay): 数据包在路由器的输出队列中等待发射的时间。如果网络拥塞,排队延迟会剧增,甚至导致丢包。
- 传输延迟 (\(d_{\text{trans}}\) - Transmission Delay):
将数据包的所有比特流推向物理链路所需的时间。
- 计算公式:\(d_{\text{trans}} = \frac{L}{R}\)(其中 \(L\) 是数据包长度,单位 bits;\(R\) 是传输速率/带宽,单位 bps)。
- 传播延迟 (\(d_{\text{prop}}\) - Propagation Delay):
单个比特在物理介质(光纤、电缆、空气)中传输所需的时间。
- 计算公式:\(d_{\text{prop}} = \frac{d}{s}\)(其中 \(d\) 是两点间距离,\(s\) 是信号在介质中的传播速度,光纤中位速约为自发光速的 ⅔)。
A. 带宽-延迟乘积 (Bandwidth-Delay Product, BDP)
这是一个衡量“链路中最多能容纳多少数据”的指标。 * 结论: \(BDP = R \times d_{\text{prop}}\) * 意义: 如果你想通过网络获得极高的吞吐量(例如跨洋文件传输),你的发送窗口或缓冲区大小必须至少等于 BDP。否则,在等待确认信号(ACK)返回的时间里,链路会处于空闲状态,导致带宽浪费。
B. 丢包与延迟的关系(Little's Law)
在排队论(Queuing Theory)中,通过利特尔法则我们可以看到: * 公式: \(L = \lambda \cdot W\) * 解释: 在一个稳定系统中,队列中的平均数据包数量 \(L\) 等于数据包到达率 \(\lambda\) 乘以平均等待时间 \(W\)(即延迟)。 * 延伸: 这意味着如果系统处理速度跟不上到达速度(\(\lambda\) 增加),延迟 \(W\) 会先缓慢上升。当缓冲区填满导致 \(L\) 达到上限时,后续包将被丢弃,此时延迟达到峰值并开始出现严重的丢包。
C. 物理极限(光速局限)
端到端延迟存在一个无法逾越的物理下界。信号在北京和纽约(直线距离约 11,000 km)之间往返一次(RTT),仅仅是光在真空中飞行的直线时间就约为: $\(T = \frac{2 \times 11000 \text{ km}}{300,000 \text{ km/s}} \approx 73.3 \text{ ms}\)$ 考虑到光纤中的折射率和路由器跳转,实际端到端 RTT 几乎不可能低于 100ms。这就是为什么“量子通信”等技术受到关注的原因之一(虽然目前量子纠缠不能超光速传信,但科研始终在尝试逼近这个物理极限)。
Chance Constrained Optimization Problem(机会约束优化问题) 是一类随机优化问题,其特点是:约束条件不是强制要求始终满足,而是要求以一定的概率(置信水平)满足。它用于处理模型中存在随机变量(不确定性)的场景。
1. 基本定义
一般形式如下:
- \(x\):决策变量(如资源配置)
- \(\xi\):随机变量(如冷启动时间、数据大小、带宽波动)
- \(g(x, \xi) \leq 0\):约束条件(如延迟 ≤ 用户给定边界)
- \(P(\cdot)\):概率
- \(\delta\):置信水平,如 0.95、0.99 —— 表示约束至少以 \(\delta\) 的概率成立
核心思想:不要求约束在所有可能的随机情况下都成立(那样可能过于保守或不可行),而是允许一定的小概率违反,只要违反的概率低于 \(1-\delta\)。
2. 论文中的具体形式(Jolteon)
在 Jolteon 中,用户给定一个延迟边界 \(\epsilon_l\),系统希望最小化成本,同时保证延迟不超过边界的概率至少为 \(\delta\):
- \(LW\)(工作流延迟)是随机变量,因为它依赖于冷启动、网络、数据大小等随机参数
- 该约束意味着:在 100 次执行中,至少有 \(100\delta\) 次的端到端延迟 ≤ \(\epsilon_l\)(例如 95% 的时间满足延迟要求)
3. 为什么需要这种问题?
- 无服务器环境存在固有性能波动(冷启动、网络抖动、资源争抢)。如果用确定性模型强制“每次都满足延迟”,会导致资源配置过于保守(成本极高),甚至无法实现。
- 机会约束提供了一种经济且实际可行的折衷:允许少量超时,换取显著的成本降低。
4. 如何求解?
论文中 Jolteon 采用了蒙特卡洛采样 + Hoeffding 不等式的方法: 1. 对随机变量 \(\xi\) 进行 \(n\) 次独立采样,得到 \(n\) 个确定性样本。 2. 将原来的概率约束替换为这 \(n\) 个样本必须全部满足的确定性约束。 3. 通过 Hoeffding 不等式确定最小的 \(n\),使得真实约束满足的概率 ≥ \(\delta\)。 4. 转换后的问题是确定性且凸的,用梯度下降求解。
5. 与其他优化问题的区别
| 问题类型 | 约束形式 | 特点 |
|---|---|---|
| 确定性优化 | \(g(x) \leq 0\) | 无随机性,总是必须满足 |
| 期望约束优化 | \(E[g(x,\xi)] \leq 0\) | 只保证平均满足,无视极端情况 |
| 鲁棒优化 | \(g(x,\xi) \leq 0, \forall \xi \in \mathcal{U}\) | 要求对所有可能的不确定性都满足,过于保守 |
| 机会约束优化 | \(P(g(x,\xi) \leq 0) \geq \delta\) | 在概率意义上满足,兼顾可靠性和成本 |
小结:机会约束优化是一种在不确定性环境下权衡风险和代价的有力工具,非常适合无服务器计算这类具有显著性能波动的场景。Jolteon 正是利用它来在满足用户 SLO 的前提下自动最小化成本。
Monte Carlo Sampling(蒙特卡洛采样) 是一种通过生成大量随机样本来近似估计复杂随机系统行为的数值方法。它的核心思想是:如果某个过程受随机因素影响,我们可以反复模拟该过程(每次随机抽取不确定变量的值),然后统计模拟结果的分布,从而估计出真实的概率或期望值。
1. 基本原理
假设有一个随机变量 \(X\)(例如无服务器工作流的延迟),它的分布很复杂,无法用公式直接算出“延迟 ≤ T”的概率。蒙特卡洛采样会做以下事情:
- 根据 \(X\) 的概率分布,独立地抽取 \(n\) 个样本 \(x_1, x_2, \dots, x_n\)。
- 用这些样本的经验频率来近似真实概率: [ P(X \leq T) \approx \frac{#{i \mid x_i \leq T}}{n} ]
- 当样本数 \(n\) 足够大时,根据大数定律,这个近似会收敛到真实概率。
2. 在 Jolteon 论文中的具体用法
论文中的约束是: [ P\big(LW(\mathbf{d},\mathbf{v}) \leq \epsilon_l\big) \geq \delta ] 这是一个机会约束,延迟 \(LW\) 依赖于多个随机参数(冷启动时间 \(C\)、数据大小 \(S\)、带宽系数 \(W\) 等)。
Jolteon 使用蒙特卡洛采样来将机会约束转换成一组确定性的约束:
- 对随机参数向量 \(\mathbf{X}\)(包含 \(C, S, W, A_i, B_i\) 等)按照它们的联合分布进行 \(n\) 次独立采样,得到 \(n\) 个样本向量 \(\mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_n\)。
- 对于每个样本 \(\mathbf{x}_i\),把随机变量替换成这个具体的数值,于是原本随机的延迟 \(LW(\mathbf{d},\mathbf{v},\mathbf{X})\) 变成了一个确定的数值 \(LW(\mathbf{d},\mathbf{v},\mathbf{x}_i)\)。
- 原机会约束近似替换为: [ LW(\mathbf{d},\mathbf{v},\mathbf{x}_i) \leq \epsilon_l, \quad \text{for } i = 1, \dots, n ] 即要求在这 \(n\) 个抽样出来的场景下,延迟都必须满足边界。
当 \(n\) 足够大时,这个确定性约束集就能以很高的置信度保证原概率约束成立。
3. 为什么需要确定样本量 \(n\)?
样本太少,近似很不准(可能高估或低估真实概率);样本太多,计算开销大。论文使用 Hoeffding 不等式 推导出保证置信水平 \(\delta\) 所需的最小样本量: [ n \geq \frac{1}{2(1-p)^2} \ln\left(\frac{|D|}{1-\delta}\right) ] 其中 \(p\) 是目标百分位数(如 0.95),\(\delta\) 是置信度(如 0.999),\(|D|\) 是配置空间大小。
4. 直观举例
想象你要估计“掷一枚骰子 3 次,至少有一次出现 6 点”的概率。你可以用蒙特卡洛采样:模拟 100 组实验,每组掷骰子 3 次,统计有多少组至少出现一次 6 点。这个比例就是概率的近似值。
在 Jolteon 中,每次“掷骰子”对应一次对冷启动时间、数据大小等随机因素的随机抽样,然后观察工作流延迟是否超标。通过大量抽样,就能可靠地判断一个资源配置是否大概率满足延迟要求。
5. 主要优缺点
| 优点 | 缺点 |
|---|---|
| 实现简单,适用于任意复杂分布 | 收敛速度较慢(误差 ~ \(1/\sqrt{n}\)) |
| 可以处理高维、无解析形式的随机模型 | 需要大量样本才能获得高精度 |
| 能够嵌入凸优化框架(Jolteon 的做法) | 计算开销随样本量线性增长 |
总结
蒙特卡洛采样是 Jolteon 将随机机会约束转化为可求解的确定性约束的关键工具。它通过大量随机抽样“模拟”不确定性,再要求配置在所有模拟场景下都满足性能边界,从而以可控的计算代价换取概率意义上的保证。
Pareto front(帕累托前沿) 是指在一组多目标优化问题中,无法在不损害至少一个目标的前提下进一步改善其他所有目标的解所构成的集合。它是多目标优化中的核心概念,代表了“最优权衡”的边界。
论文关心的是延迟(latency)与成本(cost)这两个互相冲突的目标: - 给一个工作流分配更多资源(更多函数实例、更大 vCPU)→ 延迟降低,但成本升高。 - 分配更少资源 → 成本降低,但延迟升高。
帕累托前沿就是那些“再减少成本就会增加延迟,再降低延迟就会增加成本”的资源配置点。在这条曲线上的任何一个配置,都不存在另一种配置能在不使延迟更差的情况下降低成本,或者不使成本更高的情况下降低延迟。
为什么 Jolteon 追求“导航帕累托前沿”
- 用户需求多样:有的用户优先低延迟(在线服务),有的优先低成本(离线批处理)。帕累托前沿给出了所有可能的最佳权衡。
- 自动探索而非手工调参:Jolteon 的优化器能在不同性能边界下,自动找到对应的帕累托最优点,而不是像 Ditto 那样只提供两个极端(最小延迟 或 最小成本)。
- 更灵活的性能边界保证:用户给定一个延迟边界,Jolteon 返回帕累托前沿上满足该边界中成本最低的点;反过来给定成本边界,则返回延迟最小的点。
买车时,你希望 价格低 和 油耗低。如果有一辆车 A(价格 10 万,油耗 6 L/100km)和车 B(价格 12 万,油耗 5 L/100km),两者互有优劣——没人能说 A 绝对好于 B。所有这种“无法再降价而不增油耗,再降油耗而不增价格”的车型就构成了帕累托前沿。你在前沿上选哪一辆,取决于你愿意多花多少钱换取更低的油耗。