NBJL 2020论文导读17:Serverless in the Wild: Characterizing and Optimizing the Serverless Workload at a Large Cloud Provider

王希维

 

这篇论文的核心思想是对serverless的负载特征进行分析,并提出了一种自适应资源管理策略来降低冷启动和资源浪费。

对于serverless云平台来说,一直以来的目标都是寻求以尽可能低的资源成本实现高的函数性能。函数执行的速度和消耗的资源主要取决于三个方面。首先,函数执行需要在内存中有必须的代码(例如,用户代码、语言运行库)。当代码已经在内存中(热启动)并且不需要从持久存储中(冷启动)导入时,可以快速启动函数。第二,对于平台方来说,将所有函数所需的资源始终保存在内存中可能非常昂贵,特别是在函数执行时间短且执行频率不高的情况下。第三,不同的函数可能有多种多样的资源需求和多触发器的调用频率。这些特征使得通过预测来减少资源使用变得非常复杂。以上几点清楚地表明,以低成本提供高函数性能要求深刻分析FaaS工作负载的特征。

  针对于serverless的负载,作者收集了Microsoft Azure整个基础架构中的函数调用的数据,并从函数和应用程序的关系、函数调用的触发器、函数调用模式、函数到达间隔时间、函数执行时间、函数内存使用情况等方面进行了详尽的分析。从对workload负载的分析中,我们可以总结出三个主要的结论:首先,绝大多数函数都是在几秒钟内执行的,它们中75%的最大执行时间为10——而冷启动所需的时间差不多也是几秒钟。因此,提高函数性能的关键是要减少冷启动的次数或者减少冷启动的时间。其次,绝大多数应用程序的调用频率都很低——81%的应用程序平均每分钟最多调用一次。因此,就内存使用而言,将低频函数始终驻留在内存中是一种非常大的开销。最后,许多函数表现出很大的可变性,其中40%的函数的到达间隔时间的变异系数值高于1,因此预测下一次函数调用的时间是一个非常具有挑战性的工作,特别是对于那些不经常调用的函数来说。

  针对于FaaS的工作负载,作者设计了一种自适应资源管理策略,称为混合直方图策略。该策略的目标是用最小的资源浪费来减少冷启动调用的数量。这种策略主要通过控制函数的两个参数来实现,一个是 Pre-warming窗口,一个是 Keep-alive窗口。所谓的 Pre-warming窗口就是策略从最后一次执行开始,在加载应用程序镜像以期待下一次调用之前等待的时间。所谓的Keep-alive窗口就是应用程序的镜像在被加载到内存后保持活动状态的时间。只要控制好Pre-warming Keep-alive这两个窗口,让函数在Keep-alive窗口到达,就可以避免冷启动。混合直方图策略总共包括三个部分:首先是捕获每一个函数空闲时间的范围特征的有限的直方图;其次,是当有大量的调用超出直方图范围时,一个时间序列预测分析方法;最后,当直方图不具有代表性时,还有一个保守的标准 Keep-alive方法。所以,整个流程就是 每当一个新的调用到来,首先更新直方图。然后,判断是否有大量的调用超出直方图范围,如果是,那么就使用时间序列预测分析方法,否则,判断直方图是否具有代表性,如果是,就根据这方图控制Pre-warming Keep-alive这两个窗口,否则,就使用保守的标准Keep-alive方法

      最后,就是论文的实验部分。作者使用了19台虚拟机进行实验,一个拥有8个核心和8GB内存的虚拟机作为控制器和其他主要组件(包括NginxKafka)托管容器。剩下的18个虚拟机有2cpu核心和4GB内存,托管一个调用程序来实际运行Docker容器中的函数。作者设计实验分析了keep-alive窗口的大小、直方图中截断百分位数值大小、直方图中数据的变异系数的大小、时间序列分析方法等等因素对冷启动以及内存使用量的影响,证明了所提出的混合直方图策略可以减少冷启动次数并降低资源消