基本概念:UniKernel & Libos

随着云计算的发展,应用上云是主流方向,云计算带来资源弹性伸缩便利的同时,也将软件栈变得更厚重。云服务通常部署在VM里,每个VM通常也安装Guest OS。从整个软件栈来看,Hypervisor已对VM之间做隔离,Guest再对应用做多一层隔离。相比原来Native运行环境,软件栈层次更多,对业务性能有不同程度的损伤。

那能不能将云上软件栈打薄呢,让应用具有更高的性能,工业界提出Unikernel架构解决。百科维基对Unikernel定义如下:

unikernel is a specialised, single address space machine image constructed by using library operating systems. A developer selects, from a modular stack, the minimal set of libraries which correspond to the OS constructs required for their application to run. These libraries are then compiled with the application and configuration code to build sealed, fixed-purpose images (unikernels) which run directly on a hypervisor or hardware without an intervening OS such as Linux or Windows.


Unikernel的想法是既然VM只跑一个应用,那干脆将OS和应用运行在同一地址空间,无系统调用,无多进程,提供高性能的网络,调度和文件访问功能,对应用进行加速。


从Unikernel架构的定义来看,Unikernel是一种特殊的、跑在Hypervisor里的LibOS。

AliUK架构设计

AliUK(Alibaba Unikernel)是阿里云操作系统团队一个探索性项目,基于开源Unikernel技术,结合阿里巴巴业务特点而设计的Unikernl方案。瞄准阿里巴巴业务高性能诉求,提供高性能Unikernel方案。AliUK是面向Serverless的“微安全服务”场景的下一代多种运行单元中之一。

AliUK架构兼容Unikernel和LibOS两种运行模式,对于资源强隔离场景使用Unikernel模式,而需要部资源共享的场景则使用LibOS模式。AliUK采用组件化的架构方案支持两种部署模式。

对业界比较流行的Unikernel(比如OSv,rumprun),进行性能benchmark测试,结果表明性能只比Linux提升20%~30%,并没有达到Unikernel架构预期的优势。对于阿里巴巴经济体应用来说,网络和存储是性能热点,直接使用开源Unikernel并没有给性能带来质的飞跃,反而带来兼容性问题,优势不明显。AliUK采用另一种架设计思路:复用兼容较好的Unikernel,然后替换高性能网络协议栈、IO存储栈和调度子系统,同时支持Unikernel和LibOS两种运行模式,满足业务性能提升超过50%。

为了满足业务需求的多样化,AliUK多个子系统之间可灵活组装,在可靠性、高性能和兼容性之间取得一定的平衡。目前AliUK与其它Unikernel一样,兼容性较弱, LibOS架构向上重点往性能方向发力,向下复用袋鼠的兼容性。

图1是AliUK架构图:

image.png
图1:AliUK架构图

袋鼠是阿里云操作系统团打造的云原生底层系统,面向云原生场景,打造安全隔离、轻量和高性能的基础设施,同时也是未来serverless场景的运行底座。

AliUK结合袋鼠轻量级安全沙箱技术,系统层面提供高性能的网络协议栈、调度器和存储能力。针对云原生应用下典型的Runtime(python, node.js和jvm)实现高度整合优化,针对多个领域(比如AI,视频)打造超越Linux性能的运行环境。

AliUK支持Redis方案

采用开源Redis内存数据库来验证AliUK的性能表现,验证发现Redis+Linux架构下,Linux kernel尽管使用所有处理器并行运行协议栈,但Redis性能也只能达到18W QPS。而换成AliUK架构之后,只用一个核就可以将业务运行到38W QPS,这说明AliUK比Linux有明显的性能优势。

将协议栈做到AliUK里面后,还需要转发组件实现Redis实例间的报文分发。AliUK采用阿里云转发产品,实现多实例间报文转发。

服务器运行多个Redis进程实例,共享Linux kernel协议栈,而Linux协议栈的执行路径较长、内核锁难以支持性能线性增长,造成单实例性能和多实例性能不发挥Redis内存缓存的优势。应用AliUK架构后,每个实例均独享高性能协议栈,无锁竞争,性能翻倍。

图2是Redis应用采用AliUK架构改造后的逻辑架构:

image.png
图2:Redis-AliUK方案原理图

性能效果

单实例性能:Linux 19 WQPS vs AliUK 37.2 WQPS
整机性能:实例数达到160后,AliUK接近Linux性能2倍。

image.png
图3:单实例性能对比

通过图3性能对比,可以看到AliUK高性能协议栈性能优势非常明显。Linux采用多核并行处理协议,也只能最高支持19W QPS,而AliUK协议栈是单线程协议栈,最高能跑满到37.2W QPS。

image.png
图4:整机Redis性能对比

通过图4性能对比,AliUK整体性能是Linux的2倍。从实例数增长的趋势来看,AliUK运行150个实例才将整系统容量用满,而Linux在100时就满了,AliUK支持更高的部署密度。

AliUK演进方向

AliUK作为袋鼠高性能解决方案,未来会有以下几个方向发展:

  • 支撑阿里云内部服务提供高性能解决方案
  • 针对典型应用场景做领域的垂直整合
  • 支持高性能运行环境,垂直支持典型的python,node.js和jvm运行环境。