大家好,今天由我和我同事和解,一起给大家介绍一下针对FAST场景我们在便衣器虚拟机协同设计上的一些探索这部分工作我们主要分三步来介绍首先我们会大概介绍一下FAST是什么以及基于我们的认识当前FAST存在着哪些问题最后会由我同事和解来介绍一下我们在基于外部FAST MLA技术上的探索便衣器虚拟机上的一些协同设计方面的探索首先FAST这个概念相信大家已经听到很多了从这张图我们可以看到近几年在云聚算如何如图的发展过程中创造了很多新的词比如是Info Structure SOS然后Container SOS以及Platform SOS到现在的Function SOS从这个图对比从左到右的价格物变化我们可以看到底下颜色较浅的部分现在占比是越来越高的这部分其实由云厂商来提供上面颜色较深的部分是由应用开发者或者云平台的使用者来实现的部分从图中可以看到越来越多的内容被隐藏在云平台之下应用开发者需要关注的内容其实是越来越少的只需要关注自己的核心的业务逻辑而不需要关心那些支撑业务运行的一些周边资源简单说这个架构就是要让开发人员更多的关注自己弹码的运行而不需要管理任何的一些基础设施很明显这是一种完全针对程序源的一种架构技术通过这种技术可以使软件发布的成本越来越少然后服务资源的利用率会越来越高这里我们左边给了一个简单的例子来直观感受一下FAST开发的简洁程度一个应用开发者只需要编写自己的弹码和配置然后通过调用云厂商提供的命令行接口来构建和部署相关的服务这样的话一个FAST的服务就可以直接部署完成通过Carry来完成相应的服务请求服务完之后相应的喊数实力也会随之销毁那么我们现在来看一下一个典型的FAST流程大概是个什么样的虽然各家厂商在FAST的实现上各有不同但总体的流程大致是这样的首先一个用户提交一个function然后这个function会通过API网关打到相应的喊数始终再通过调度器根据任务和一些调度策略调度到不同的excutor进行执行然后每个excutor背后都会对应着不同的开发语言这里只列了C++ GS以及Java这三种其实实际的云厂商所能提供的语言还很多包括Java的话他所使用的版本也会千差万别可能有的是Java 8有的还会用Java 7从这个图我们可以看到不同的开发语言会引入不同的语言运行时这其实会带来一些语言碎片化的问题此外FAST在启动的时候也会消耗一定的资源这个也是各大云厂商在不停的优化第三是针对于函数计算本身经常会提到的就是一个比较重要的问题就是能启动时间能启动对用户的体验非常重要因为引入了VM和容器通常启动可能在秒击所以能启动本身也是各大云厂商重点关注的问题此外对于很多计算敏感的应用部署其实性能相对来说还是比较重要的需要投入更多的优化来获得更好的性能体验因此我现在总结一下我们当前FAST可能面临的一些问题首先是运行时碎片化问题然后是因为启动会消耗很大的内存资源第三个问题是相对比较长的冷启动时间对于某一些性能比较敏感的应用本身的性能优化也是大家关注的重点相信很多人已经听说过外把三百例技术这个在2019年W3C正式确定为D-STAR外部标准语言那么如何利用外把三百例新型技术来解决我们在FAST业务场景下遇到的问题下面就有同事和解向大家介绍我是和解我会来讲一下我们在FAST场景下用Wasn来做一些FAST业务的尝试介绍我们做了一些探索我们之前说过Wasn是一个新的沙河语言可以认为它是一种语言新的Badcode为了把所有业务能够转到Wasn上来必然需要一些编辑和Wasn本身Longtime的配合所以我们这里也是需要一些codeden我会为了这个来讲一下我们现在来做了一些尝试吧首先我介绍一下什么是外把三百例大家只讲一下它的特点这样我们对理解为什么我们选择这么做或者为什么选择Wasn来做FAST的解决方案首先Wasn是一个新的一个标准是由浏览器厂商W3C接受了以后浏览器厂商为了来隔离它一些不安全的代码所以设计了一种新的Badcode然后成为了W3C的标准它有一个很重要的特点就是说一一首先它是portable的就是说它便于移植所以它是跨拼台因为大家都采用这种Badcode二就是说它天然的是具有一个沙盒的性质就是在设计的时候它就考虑到了一个浓挫性和安全就是说它支持SFI和CFI这两个特性SFI就是说软件浓挫CFI就是控制流的完整性然后本身它又是一个设计一个全新的Badcode出于性能考虑它也尽量能够接近于Native的速度然后它有为了访问后省能力它本身是没有访问后省能力的一个设计为了访问后省能力那么现在有一些新的标准提出来就是像WasiWasi的话它是基于一个capability system的一个安全模型就是说任何用户想要访问后省能力都必须要先获得一个能力获得一个capability那么这样的好处就是说它比原来的如果用户角色来访问那样的一个安全系统来说它的访问控制来说更细利度就比如说你即使是有一个路的权限但是你没有capability的话没有你当前目录的系列或者读的权限的话你还是无法对这个目录或者文件性操作所以它是一种它有一种更细利度的一个访问控制的一个能力至于这两个东西的话我们本身就是说一个安全portable然后就是能够做细利度的一个访问控制我们来就是说把它运用到Fast这个场景下然后呢Wasi本身是从外部来的但它实际上本身不止于能够运行在外边所以这也是我们一个考量嘛然后我再介绍一下它本身它Sahe怎么做这件事情首先Wasi就是说它每一个Wasi模块它会有自己的一个限定空间这个限定空间通常会分成几个部分吧就是说一个是它的对有它的Global静态数据区然后还有一个Stake然后这几个部分合成了它一个限定空间它所有的用户代码一旦编一层Wasi以后是不能访问超过这个限定空间以外的地址的那么就是说所有的用户代码如果你本身是不安全的那么你还是不安全但是你这个不安全的是逃出不了这个Sahe的就是说你影响不了Sahe外面的部分你把里面搞的一团招这本身没有任何问题然后你访问外部控制的话需要一个host的一个API的一个提供这个是通过Wasi来访问这个右边图上红色的部分然后你通过这个API的话才能访问它系统资源然后通过限定空间的划分的话我可以在一个机器上在一个运行上一个运行上我能运行非常多的一个那个挖身实力那么其实说取决于数量就是取决于你当前限定空间够不够划分了然后我们再看下来关于那个那么既然我们有了这样一个东西然后我们怎么能够统一一个就是刚刚汤尾提到的就几个问题我们来尝试用挖身来解决这几个问题首先就是一个语言的税片化问题我们知道在那个在做法子场景下如果用户的业务非常多它会有不同的语言来运行比如说用C++C或者Rust这种还有像Gol 像JSJava这种的目前像一些主流的一些像一些就是说早期的一些语言比如说不安全的语言比如说C和C++还有RustGol这些现在都可以变成直接变成挖身因为挖身的MVP的标准的话就是说它通常是为了解决不安全语言的安全性问题所以它優先考虑这些语言能够直接变成挖身那么像JS像TSJSTS或者Java这种语言它本身是个托管语言本身其实就已经支持SFI和CFI就是说它在语言层面上它的类型系统就已经确保你不可能写出一个违反CFI和SFI的代码所以说它其实目前来说不能直接很容易的变成挖身这一步那么我们对这个也进行了一些尝试就是说首先我们假设的前提就是说发誓场景是一个业务受限的场景用户写的代码其实是需要受到一定的限制的而不是说任何代码都能够做那么在据这个前提下就是说我们可以通过限制一些语法的使用限制用户语言动态性的一些场景然后限制做一些限制这样的话我们就可以把一些尝试把一些托管语言翻译成为挖身编译成挖身那么就比如说我们有几种方法常用的方法就是说我们把一些语言的解释器可以直接通过带着Long Time一起翻译一起编译成挖身这是一种办法还有就是说我们可以把用户的代码拆分成就是说动态性和静态性的代码静态性代码我们直接编译成挖身然后和动态性代码还在原来的语言运行时里面运行这样的话当中通过一些交水代码来连接还有一些办法就是说我们可以直接砍掉用户的动态性的语法然后直接把整个语言运编译成挖身这当中我们直接的方法就是说你现在社区有一些像GCA Proposer一些方法能够但是现在还在发展当中还有就是我们可以编译成其他的一些语言然后它通过这些语言来再翻译成挖身这也是我们尝试走过的一条路然后这样的话当你有了这样挖身模块以后我们还是跟原先传统的发射场景的部署是一样的比如说用VM加Doc加上挖身模块这就是说这样的话它解决了一个碎片号问题但是它依然会带来一个其他两个问题还是存在的比如说刚刚说到资源的消耗还有就是说性能还有一些冷启动的问题所以我们接下来还会看看有什么办法来解决这些问题那个首先就说我们讲到了一个解决这个资源消耗的问题就是说我们利用挖身来做一个多注户就传统的那个发射场景的多注户就是说是每个应用每个用户的应用户在一个Doc里面那么这就是一个application content的概念这样的话当你有很多的function业务的话你要去request来的话你需要启动非常多的content那么业界也有很多办法来解决这个冷启动和资源消耗的问题比如说他们用一些更轻量的采检的content或者conna然后他们用一些比如说把name space替换掉来加速content的启动速度然后他们还有就是说把一些content先娱乐先放在那边或者是利用fork的方法来启动content这样的话好处就是加快的速度能够把content的速度提高到大家能够接受的发生能接受的一个指标但是我们觉得这样的场景的话还是比较麻烦然后不是很容易推广那么我们也有我们的想法就是说我们首先认为就是说传统的一个Doc里面只能起一个应用本身这个方法就对部署密度就不能提高部署密度而且资源浪费比较厉害所以我们的想法就是利用以及和挖身程序本身就是能够实现那个CFI和SFI和现金空间的隔离来在Doc内部作为一个多租户的实现那么我们就是说把那个在一个Doc里面可以部署非常多的方式这是一个前提这样的话我的部署密度就一下就上去了然后当我在需要启动一个新的方式来针对那个Request的时候我其实可以现在当前这个Doc里面找到一个空前的现金空间然后再分配一个VM的那个就是那个挖身的实力来针对这个方式这样的好处就是我能启动的速度也非常快因为我不需要再启动Doc了因为Doc启动可能是按秒算嘛那么我直接启动一个挖身就好了这挖身通常来说就非常快那么然后我通过这个挖身的隔离来来做到这个保证互相之间的一个业务之间互相不会有些攻击那个因为那个传统的Doc他们是通过进城级的隔离嘛而我现在通过挖身能够做到一个在进城内部的一个隔离就是我们共享同一个大的现金空间但是现金空间被我划分成了一段段更小的现金空间然后我们再针对这个我在讲的更细点嘛就是说首先一点就是我们认为Fast这个业务它本身有一个它的特点它就是非常短它是Shot Live的就是说那么它非常短的话那么如果我起很多Content的针对它其实非常不合算嘛然后就是说同样我起很多Content来调度的话再通过OS来调度的话也是非常新的开销特别大因为OS的调度通常设计到上下午的切换设计到TLB的Cache的那个清空然后设计到那个进出科呢那么我们也认为这个开销也非常大那么我们所以我们就想利用挖身来做一个在用户台的一个调度像类似于就像像我们现在现在很流行的比如说用鞋层用勾来实现一个用户籍的调度那么挖身的它的好处其实它和鞋层其实非常像它本身就是可以从一个挖身模块运行到另外一个挖身模块的时候它实际上可以在同一个线程上然后只是切换了一下线型空间的那个只是切换了线型空间我可以把线型空间认为是一个一个上下午一个任务的上下午嘛那么这样的话实际上就是线型空间的切换但是它比鞋层更好的一点就是说鞋层不能保证就是说每个扣路厅之间不会互相侵犯到对方的空间而我们在挖身这里面每个线型空间实际上是不可能逃出这个线型空间的那么天然就是说它在即时现在鞋层的概念它又保护了又防止了每个线型空间受到攻击所以说可以做到一个有效的隔离至少在线程内都能做到隔离了那么还有带来一个附加的好处就是说当我们把方可逊组成一个macroservice的时候就是说因为一个大的红服务是有很多小的微服务组成的那么这时候我们我们也逃避掉了原先那个原先掌线的发尸它的调度的话它必须把在解决几个content之间互相调用的一个问题因为它每个content是一个服务那么我们现在假设我能在一个线程里把这些服务起起来那么我其实可以优先调度通过好多调度器的话我能够把同一个微服务的方可逊放在同一个线程里来执行那么我在同一个线程里的方可逊之间调用其实我就变成了一个变成了一个方可逊调用了我都不是一个跨境不用做一个ipc的调用了那么我的开销会进一步降低最后我们又回到了之前说到一个性能的问题就是说在那个在那个一旦一个应用或者说一个拓弯语言或者是个C或者是加加语言它被编译成Warsing以后它贴蓝的性能损失因为首先它会变成了一种新的一个表示然后这个表示又被再去编译或者解释的话它同样它会引来新的语言和龙语代码它会调一个性能还有本身它有一些沙河的检查代码一些CFI的检查代码那么这部分性能损失会大概通常会有百分之几到百分之十几的一个损失所以我们也想就是说是不是能够通过一些办法能够把这份性损失在弥补回来所以我们想了一个贴蓝的想法提供一些类似于像PGO一样的服务在用户的代码如果提交用户的方式代码如果提交到我们的平台上的时候我们首先把它编译成一个最基本的版本当在运行的过程当中用户我们会搜集到一些profiling信息随着profiling信息我们大概知道用户的业务代码经常是什么样的data的一个pattern什么样的那么通过编译的方法能够把它生成出更优的代码这样的话我们就会做一次更激进的优化然后生成出更好的AoT代码就是Native代码这样的话再推到发布巡杖去运行推到社会上去运行这样的话我们希望能够得到一个大概有几到百分之十左右的一个性能的一个好处但是同样有可能就是说当如果突然来帽次数据的话可能会得到一个相反的效果这还需要更进一步的调油这也是我们的一个比较普速的想法吧最后就是说Wasn这个社区包括Wasn本身这个生态现在还不是非常成熟对我们来说就是说我们期待做了很多尝试其实都还是一方面是在演的社区的一个方向在走一方面我们也在做一些探索不成熟所以它一些编辑包括一些一些Proposal或者一些工具链工具一些都不是非常好用包括说虽然大家都认为Wasn可以变很多语言变成Wasn但事实上这点非常难我们也在做一个尝试也希望更多的人来加入进来吧就是说包括Wasn的多么快也好Wasn的一个能够通过Wasn来做更多的事情我们也有些想法就是说希望以后能够跟大家一起分享吧今天的分享大概就到这里吧谢谢最后 不好意思最后一个我们还有一个谢谢大家来来观看本次那个分享吧然后还有一个我们部门的二维码想跟大家然后希望大家能够发挥然后大家做一些技术探讨吧好 谢谢大家