本次参加OSDI18负责的是第十个Session,该Session与网络相关。
本文简要介绍本Session的相关工作,其包括三篇论文,分别描述了将计算向数据中心迁移、利用有限的带宽结合DNN模型做高分辨率的视频传输 以及 将计算向网卡迁移的相关工作。
Chinmay Kulkarni, Sara Moore, Mazhar Naqvi, Tian Zhang, Robert Ricci, and Ryan Stutsman, University of Utah
在云存储领域,将计算和存储分离的方法已经有较为深入的研究,进一步提升性能遇到了瓶颈。这是因为传统的存储端只支持简单的查询与更新,而在服务器端进一步提升性能只能在极小粒度的操作上挖掘,这在目前单次操作耗费周期已经很小的基础上,提升空间非常有限。将存储服务器上的操作切分的很小虽然能通过优化大幅度提升吞吐率,但是会带来以下问题:
下面通过几个问题,初步介绍Splinter的各种特性:
Q: 客户端怎么将扩展的代码发送到服务器端,如何进行远程调用执行?
A: Splinter的流程如下:
Q: Splinter是如何使用最低的成本来隔离不用用户的扩展代码?
A: Splinter使用RUST在静态分析的时候进行隔离。若使用硬件隔离,则会由于服务器频繁地上下文切换导致性能下降。而由于Splinter在用户态运行,为了避免陷入内核态产生上下文切换,Splinter使用了Kernel-bypass的DPDK来避开陷入内核,而键值对的存储与操作由于本身是in-memory的数据库,不需要陷入内核态操作。
Q: Splinter如何在服务器端运行代码?
A: Splinter整体只有一个进程,共享一个地址空间。所有的用户安装的扩展程序都以一种轻量级的线程(generator task
)的形式运行。
而每个核心运行了一个worker thread
,该线程充当了调度器的角色。
除此之外,单独有一个dispatch task
来从接收队列来创建对应的generator task
处理请求调用的扩展的程序。
generator task
作为轻量级线程,本身没有自己单独的栈,而是使用worker thread
的栈进一步削减切换函数栈的开销,再加上本身只有一个地址空间,不存在切页表,所以在不同的generator task
之间切换的开销非常的小。
Q: Splinter如何进行调度?
A: 调度由每核心的worker thread
进行处理。Splinter采用非抢占式调度,当扩展中调用了存储操作API后会自动yield,其他情况下需要等待其主动完成后让出核心。针对耗时较长,或者恶意的extension,有一套watch dog机制来保证不会出现一直占有CPU的情况。其主要方法如下:
worker thread
,并从之前的任务队列中将剩余的任务拿回来继续执行。Q: Splinter如何进行存取?
A: Splinter为内存中的键值对数据库,其提供了一系列存储的API,用户书写的扩展程序可以通过API来进行对KV数据库的存取操作。
Q: Splinter的routing策略如何保证本地性地同时避免出现hot-point?
A: Splinter 采用较为直接的routing策略:
Splinter还有针对存取过程的优化等内容,详细见论文。
Splinter的一个亮点就是避免了网络传输等瓶颈,避免了不必要的数据传输,将瓶颈放到了服务器的性能上。通过增加服务器数量以及服务器的处理能力即可改善Splinter的性能,相较于提高带宽或进一步优化服务器对单一操作的优化,简单提升服务器的数量以及性能为更简单的解决方案。
而Splinter也需要对应用进行修改,比较适合对数据进行图遍历,或简单数据处理的程序。对单一的查询程序,Splinter将不会带来任何好处。
Hyunho Yeo, Youngmok Jung, Jaehong Kim, Jinwoo Shin, and Dongsu Han, KAIST
传统改善网络串流传输质量的方法有一部分是在带宽上下功夫,找到符合当前网络状况的视频质量,从而更加有效地使用现有的带宽。使用该种方法视频质量提升的上限局限于网络带宽。
而另一部分使用各种压缩、解压缩算法,可以一定程度绕开带宽的限制,提供更好的服务。传统的压缩与解压也有一定的局限性,如针对视频这一类非结构化数据,在压缩到一定程度后不一定能准确地传输视频内容。
本篇论文的工作主要使用服务器训练了针对具体视频内容从低分辨率映射到高分辨率的DNN,从而达到仅传输低分辨率与DNN模型,最终实现播放高分辨率的效果。
使用DNN来做低分辨率到高分辨率的映射的理论基础是,在一个视频中,有很多元素是重复的,从而可以找到一个从低分辨率的该元素映射到高分辨率的特征。
为了实现上述功能,该系统有一些关键设计。在下面将简要描述该系统设计中的几个关键点以及采用这种设计的用途等。
在该系统中采用内容感知的DNN的具体原因上面提到过,在同一个视频中,重复的元素更多,更加有利于训练出,能准确地将低分辨率的该元素转换为高分辨率的该元素的模型。
而采用这种策略时,服务器会由于需要针对每个视频内容训练对应的DNN模型,这将会消耗大量的时间与服务器的资源。
该系统采用的解决方法是先训练一个通用的的DNN模型,然后再针对不同的视频内容训练不同的内容感知的DNN模型。这样会大大减少训练单独的模型所需要的时间。
为了应对客户端不同的计算能力,同时保证能在开始传输时,能尽使用视频加强的效果,该工作提供了一种可扩展的DNN模型设计。这种设计中最主要的思路是将不同layer的DNN划分到不同的块,每个块都可以直接将结果转到输出。客户端可以选择经过哪些块的处理,同时在刚开始传数据的时候,仅仅需要几个块就可以开始感受到DNN增强的效果。
上图为可扩展DNN模型设计的一个示意图,其中将480p转换到1080p的DNN如上图中黑框内所示。其中虚线的是DNN-model的第一个块,包含了基本的DNN-模型,而中间的均为不同数量layer组成的DNN-block,可以选择其中一些进行处理。使用的block越多,最后得到的效果越好。
而该系统面临的另一个问题是,在某一个时间点,该选择下载视频内容块还是DNN模型块能够使得当前提供的服务质量得到最大的收益。
该工作选择采用加强学习的方法来在这两个之间进行选择。
选用论文中的一个例子来解释一次视频传输增强的流程 (client-side only) 。
该流程如下:
该工作在技术上的创新点不多,其本质上是一个利用DNN对有一定模式的内容进行压缩的探索,在会场询问作者关于具体压缩率,作者回答大约在70%左右。
但是该工作利用有限的带宽传输高质量的视频内容的想法非常有趣,特别是在当今还没有网络带宽能够满足已经非常普遍的4k电视的视频串流。但是这个工作的主要瓶颈是其本质上是在客户端计算与网络带宽的使用上的一个trade-off,在节省带宽与消耗用户端资源与能耗中进行选择。很遗憾,在poster环节与作者交流时,他们并没有做任何功耗相关的工作,而功耗对于手机这个看视频需求最大的平台往往是最为重要的。
所以总的来说,这是一个比较有商业价值的工作,不过还需要很多工作将其变得可用。
Phitchaya Mangpo Phothilimthana, University of California, Berkeley; Ming Liu and Antoine Kaufmann, University of Washington; Simon Peter, The University of Texas at Austin; Rastislav Bodik and Thomas Anderson, University of Washington
最后一个工作主要是提供了一个新的编程模型,使得开发者能够方便地利用网卡空闲的计算能力,将一部分计算任务分配到网卡运行。
而这个工作主要动机是有以下观察:
Floem主要其由如下几个部分组成
Segment最终如何在CPU或NIC上执行?
Fleom的Compiler会将这种针对数据流的应用程序编译为针对CPU以及针对NIC可以运行的的代码。对于原来的一个Segment中的一系列的Elements,会被编译成一系列的function call。编译器将原来连接到下一个Element的output port置换为一个function call。
Segment如何进行划分?
Segment的划分最终交给开发者决定。实现同样的功能可以使用不同的划分,最终可以尝试不同类型的调度方法。
Floem提供了一种针对CPU和NIC合作的抽象与编程模型,能够让使用者轻松地在不同的搭配与策略中自由切换而无需改动大量代码。针对不同类型的程序,作者使用Floem将一部分计算放到NIC上执行,得出以下结论: