serverless冷启动延迟解决方案

527 阅读6分钟

0、一点感悟

由于学业的需要最近开始看论文了,为了对看过的论文进行梳理总结,因此决定开个专栏进行总结输出。 论文为什么很多人不喜欢,是因为写作的方式有点反人性,但是却蕴含着宝藏,因为通过读论文能快速了解一个技术领域的解决方案、研究热点。话说最近搜到了一个算法实现的招标,价格接近百万,如果有人既能从论文中摄取营养又有很强的工程经验,就多了一个赚钱的可能。 同时读论文可以找到技术理论的原始出处,例如公众号上写烂的分布式事物、并发调度之类的都可以找到理论的原始出处,这种感觉很赞。

话说上期介绍了knative实战教程,很多朋友反馈还不错,这次来个更深一点的,也是我从论文中学到的思路,分享给大家。

1、serverless为什么会有冷启动延迟

serverless最大特性是方面的扩缩容。这意味着,在通过事件触发函数后,函数将被部署到容器中,并给定所有的执行它所需的资源。当函数执行完成且没有后续请求时,所有已分配的资源将被释放。这就产生了一种“随费随付”(pay-asyou-go)的成本模式,即不需要为空闲时间付费。这种性能虽然降低了成本,但也带来了冷启动的挑战。例如,在图像识别场景中,我们想要识别的一张照片存储在Amazon S3中。图像识别功能部署在AWS Lambda上,使用Tensorflow库进行图像识别,图像识别也存储在S3上,并通过HTTP事件触发。当事件开始时,Lambda平台调用相应的函数并将其部署到容器上。然后从S3下载Tensorflow库和所需的映像,并提供给函数。因此,该函数的执行步骤如下: 1.drawio.png 由于每个步骤都需要时间,对于一个新的请求都要重复以上步骤。这就是所谓的冷启动延迟。另一方面,如果并发请求的数量超过了可用容器的数量,则必须创建函数的几个实例,每个实例将分别执行上述步骤。原因是在这个计算模型中,函数的每个实例都部署在一个单独的容器中。因此函数第一次运行中被延迟,以应对扩容。函数执行步骤和冷启动延迟如下图所示。对于前两步的延迟,应采用降低延迟的冷启动方法。同时,开发者应该选择一种合适的编程语言。 image.png

2、解决方案

最常见的serverless计算平台有AWS Lambda、谷歌Cloud Functions、Microsoft Azure和IBM Openwhisk。根据研究,一般有两种方法来处理这种延迟:第一种方法尽量减少冷启动延迟(optimization Environments),第二种方法尽量减少冷启动发生的频率(ping)。

2.1、减少容器准备延迟

使用一个容器函数:这种方法会导致CPU和内存开销,并增加空闲函数的成本。

  1. 在OpenWhisk和OpenLambda平台运行后暂停容器:这些平台不考虑预热容器。因此,函数的第一次执行会经历冷启动延迟。但是在执行之后,容器会暂停并在一段时间后完全释放。如果在此时间段内有任何请求,则容器将被重用。这种方法可以减少冷启动,因为重用暂停的容器比分配一个新的冷容器有更低的延迟。
  2. 使用裂变和Knative平台的现成容器池:这些平台有一个始终运行的容器池,这减少了延迟并提高了效率。注意,这种方法在成本和资源上都是无效的。
  3. 通过谷歌云函数和AWS Lambda函数执行后保持容器warm:在执行一个函数后,这些平台保持容器warm以响应任何后续请求。保温容器的时间没有一般的门槛。例如,谷歌平台使85%的容器保持5小时的预热,而lambda的预热时间在15分钟到5小时之间,这再次导致资源的浪费。
  4. 使用两个热容器队列和冷容器队列,其中每个函数有一个热容器队列和一个普通冷容器队列。为了响应传入的请求,平台首先使用暖队列中的容器,如果暖容器不可用,则将冷容器分配给该函数。由于暖容器的就绪队列,资源消耗不是最优的。
  5. 应用沙箱:采用应用沙箱,以减少容器准备的延迟。平台减少延迟的解决方案是应用程序级别的沙箱,即在应用程序级别隔离逻辑。这种方法考虑应用程序逻辑的两个级别的隔离:不同应用程序之间的隔离,以及同一应用程序的功能之间的隔离。这种方法要求不同的应用程序具有较强的隔离性,应用程序的功能不需要具有较强的隔离性。因此,应用程序的功能不是部署在单独的容器上,而是每个应用程序运行在自己的容器上,其功能运行在相同的容器上,并由容器中的不同进程分隔开来。这种方法有两个优点:首先,创建新进程比创建新容器的延迟更低,其次,函数之间的共享库只在容器上加载一次。

2.2、减少函数库加载的延迟

  1. 预加载所需的库:通过这种方式在执行函数请求之前,将经常使用的库安装并存储在内存中。
  2. 在应用程序沙箱方法中,由于应用程序的所有函数都部署在一个容器上,函数之间的共享库只加载一次。但是,在其他解决方案中,必须对在单独的容器上创建的函数的所有实例执行加载。

下面我们对现存serverless平台冷启动框架做一下对比 image.png

3、总结

通过读综述类的文章了解目前问题的解决方案,为后续的改进提升提供灵感。好了,感谢关注,下期见!