随着虚拟化技术和软件体系结构的不断发展,云函数(也称无服务计算)逐渐成为一种新的计算范式,该范式允许用户直接部署函数代码,而不必关心基础架构,同时能够提供极高的弹性和快速生灭能力。然而,现有的云函数通常运行在功能较为完备的容器中,存在启动延迟高、资源共享度低、镜像构建和分发时间长等问题。本文分析并验证了影响Linux容器启动时延和资源共享的关键因素,提出了面向云函数的超轻量运行时环境构建方法,该方法从资源隔离、资源限制、文件系统、网络通信等方面对运行时环境进行定义,基于操作系统虚拟化技术,通过进一步抽取共享层来提高资源共享度,通过降低网络隔离和控制组操作的性能瓶颈来加快启动速度。根据上述方法实现了超轻量运行时环境引擎FRE (Function Runtime Environment)。实验中,从顺序与并发启动时间、内存资源利用率、镜像大小等方面对FRE与当前主流的Docker容器引擎进行对比实验,验证了FRE在云函数场景下的有效性。
传统云计算自上而下可以分为应用层(SaaS)、平台层(PaaS)、基础层(IaaS) [1]。云函数,也称无服务器计算(Serverless Computing)或函数即服务(FaaS),是一种新兴的云计算范式,其计算的基本单位是独立的函数。为了保证应用之间的安全性,函数通常在具有受限资源(例如CPU 时间和内存)的容器或其他类型的沙箱中执行。与传统的基础架构即服务(IaaS)平台中的虚拟机不同,函数实例仅在调用时启动,并在处理请求后立即进入睡眠状态,租户按服务调用次数收费,无需支付未使用和空闲的资源[2]。云函数平台对租户完全隐藏了服务器管理,提供自动弹性伸缩能力以适应负载,这样开发人员就不必关注底层机器的数量和配置,这也为云提供商带来了提高其计算资源效率的机会[3]。
相比于传统服务,云函数具有许多新的特性:其计算的基本单位是函数,粒度更细,单主机实例密度更高;函数的运行一般靠事件驱动,运行环境的创建和销毁更加频繁。这些特性使得云函数运行环境面临新的挑战:隔离的细粒度的计算单位降低了资源共享度,尤其是内存资源;频繁的冷启动会给请求的处理带来额外的时间开销[4]。因此,云函数的运行环境需要具备快速启动能力和较高的资源利用率。
近年来,容器技术一直是学术界和工业界研究的热点,并广泛用于云函数[5] [6]、微服务、软件开发运维(DevOps)等领域。容器使用操作系统虚拟化技术,利用内核功能来打包和隔离进程,可以作为常规系统进程运行[7]。相比于虚拟机,容器具有无可比拟的轻量级优势,其共享主机的内核,镜像文件的体积更小,创建和销毁速度更快。容器通常比传统VM 效率更高[8]。
尽管容器具有轻量级优势, 但将现有以Docker [9]为代表的容器作为云函数的运行环境仍然存在一些问题,具体而言:现有容器使用Linux 命名空间(Namespace) [10]机制来实现多方面的隔离,使用控制组(Cgroup) [11]来限制进程可使用的资源,这会对容器的启动速度带来一定的影响;其次,现有容器通常封