阿里巴巴|阿里云 FaaS 架构设计( 二 )



如何提升资源使用率
在实际研发过程中发现 , 相同QPS下单位时间片内调度对资源量的影响非常大 , 我们可以通过调度提升资源使用率 。 例如在下图中 , 我们看到宏观状态下的整体 TPS 是非常稳定的 , 然而事实上 , 我们放大到毫秒级别会发现 , 其实非常不均匀!那么这种不均匀到底会给我们带来什么影响?

假设我们每个容器被设置的最大并发度为 1 , 即任意时刻一个容器只处理一个任务 。 下图展示了 abcdef 多个请求在不同时刻点被调度时对容器数目的影响 。

可以看到场景一时 , 每个请求均匀打入时 , 任意时刻只需要一个容器就够了 , 这种情况就是我们理想中希望能达到的;
而在场景二下 , 如果调度发生了滞后 , 可能导致前置的请求和后来的请求混到了一个时间点 , 导致容器数目翻倍 , 在中间的空白处 , 这些容器又没有被充分利用造成了资源的浪费;
在场景三下 , 如果容器启动耗时较长 , 或者调用耗时变长 , 原来的 b 请求会和 a 请求出现时间上的叠加 , 导致又需要创建新的容器 , 而新的容器如果需要较长时间的冷启动 ,又会导致和 c 请求出现时间上的叠加 。 如果调度系统实现得不够好 , 这样一来就可能产生雪崩效应 , 导致资源使用量暴涨 , 而实际使用率却极其低下 。
通过上面几个场景 , 我们可以大致为资源使用率的开销上总结一个优化方向:





























尽可能让调度更均匀、更合理 , 避免扎堆唤起容器 尽可能降低冷启动时长 , 避免短期大量容器都处于创建当中 , 避免无意义的系统调度开销 除了上述外 , 我们还可以考虑高密部署 , 将单机的资源使用率提升上去 如何容灾、防止雪崩? 在实际操作中发生异常的时候 , 用户请求会出错 , 出错后会重启或调动新资源创建新的容器 , 但这样会导致整个延迟增大 。 用户有又会重复尝试 , 重复尝试则会导致负载升高 , 从而又引起异常 , 如此恶性循环 。 可以通过优化启动速度、多 Partition 容灾部署、指数退避重试、Breaker 阻断异常请求、多可用区备灾、SLB 阻断 DDoS 攻击来防止雪崩 。二、基于神龙高密部署的FaaS (1)为什么需要做高密部署? 一是因为弹性启动速度要求高 , 希望做到每秒1万个容器实例的启动、启动延迟控制在300毫秒以内、容器的存活时间在分钟级别、资源粒度128MB; 二是成本更低 , ECS 架构因安全隔离问题资源碎片多 , 突发调用延迟高 , 影响资源数目; 三是性能 , ECS 单机缓存少、请求毛刺率较高、请求最大延迟高; 四是稳定性 , 高并发对系统冲击、频繁的创建删除资源、ECS管控压力 , 爆炸半径难以控制 。(2)高密部署架构带来的技术难题 整个高密部署架构带来的一些技术难题: 首先要面对的是如何解决单机多租户隔离安全风险 , 如果不解决这个问题那么就无法做到单机多租户的安全高密部署 , 这样资源使用率密度无法有效提升; 其次是如何解决高并发下启动速度问题 , 如果无法做到这点 , 如我们前面所提到的 , 冷启动时间较长会严重加剧资源的开销 , 同时严重影响用户延迟体验; 再就是如何解决单机多租户VPC网络打通及安全问题 , 这一点其实非常重要 , 我们在 ECS 上建立 VPC 网络连接的速度非常慢 , 这也严重影响了用户冷启动及资源的使用; 另外我们还需要考虑如何设计高密部署下的技术容灾方案 , 因为任何一个计算节点的异常会带来大量用户的服务异常 。(3)基于安全容器模板技术的优化 我们是如何做到基于安全容器模板技术的优化的?每个容器独占一个虚拟机沙箱 , 这个沙箱相当于是一个独立的虚拟机 , 有自己独立的 linux 内核 , 这样一来每个容器都是通过独立的 kernel 来做安全隔离 。 神龙启动时模板化大量虚拟机用于提升启动速度 , 通过 virtiofs 延迟挂载用户代码目录 , 通过虚拟机微内核隔离用户 , 可以做到单台机上每个微内核20M左右的内存 , 单机至少 2000 个容器 , 控制它的冷启动时间是在250毫秒左右 。 通过调度算法 , 我们可以合理地使用资源 , 承诺用户的资源 quota 。(4)代码按需加载 代码按需加载是通过以下几个方面做到的:用户容器会重复使用同一份代码 , 单台神龙只需下载一次;脚本语言包含了大量用不到的代码;使用使用 FUSE(用户空间文件系统)来做中间层文件的真实读取;底层使用 NAS 做低延迟的数据下载;OSS(阿里云对象存储)做高带宽支持的数据下载 。 注意到 , 我们这里混用了 NAS 及 OSS 一同来做代码的加载 , 需要注意的是 , NAS 的访问延迟相对而言更低 , 对于小文件的加载更快 。 我们在加载初始阶段开始全量异步从 OSS 下载代码 。 而对于需要立即访问的数据 , 我们则从 NAS 上读取 。 由于我们将整个用户代码目录做成了两个文件:一个为目录文件索引数据 , 另一个为文件内容数据 。 由于 NAS 访问延迟低 , 我们可以通过类似 GetRange 的方式去数据文件上获取小文件内容 。 这样就可以用最快的速度即时加载用户代码来达到快速冷启动了 。(5) VPC 网络优化 基于网络服务网格的 VPC 网关代理是通过用户VPC网络安全隔离 。 我们过去在 ECS 方案上插拔 ENI 网卡非常耗时 , 至少需要2~3s , P99甚至达到6~8s 。 在高密部署的神龙方案上 , 我们没有必要为每个安全容器做多次网卡插拔 , 只需要在神龙机器上统一打通到网关代理 , 而用户 ENI 网卡常驻在网关集群上 , 这样整个网卡的加载速度会变得很快 。 这样对于用户体验和资源开销都会是一个巨大的优化 。(6)资源分配率 通过混合部署多租户各类业务提升部署密度 , 合理配比不同资源需求的容器到一台物理神龙 , 从而提升资源分配率 。三、总结 讲师简介:朱鹏 , 阿里云 Serverless 技术专家 原文链接:https://developer.aliyun.com/article/819594?utm_content=g_1000311879 本文为阿里云原创内容 , 未经允许不得转载 。