同样是今年寒假读的


两年前的paper的升级版,这次是利用Disco在一个多核电脑上跑多个操作系统并虚拟成一个cluster。主要解决了两个问题,一是容错性,当硬件错误发生时如何把影响缩小到一个单元里;二是资源的管理,如何高效地在虚拟机间动态的分配物理CPU和内存。

容错和动态资源管理在某种程度上相互矛盾的。因此在分配资源的时候,要尽可能的减少一个虚拟机使用的cell数。这里的cell是指相对独立的容错 单元,后面还提到一个node的概念,Origin 2000上每个node含两个CPU。CD还提供了两种快速的进程间通讯的primitive,RPC和message。

关于容错,有这么个问题,Disco在操作系统和硬件之间多弄了这么一层虚拟层,某个虚拟的操作系统出问题时可以不影响到其他操作系统,可是操作系 统不也是保证了进程间的互相独立,当一个进程异常时不影响另一个进程吗?多设立一层Disco对容错有什么帮助吗?这个问题的答案在于,VMM的代码量很 小,可以看作是一个可信的系统软件层(trusted system software layer),因为当VMM的代码行数少于五万行时,它的复杂度就和其他可信的层(如cache coherence protocol)差不多了,这个复杂度比现代操作系统的复杂度差不多要低两个等级。

传统操作系统通常使用一个全局的run queue来管理和分配进程在多个CPU上的运行,这种实现不适合CD的容错要求,也带来了更多的contention。所以CD为每个VCPU维护了一 个run queue,同时引入了VCPU migration的机制来平衡VCPU的负载,按颗粒度分三级,intra-node intra-cell inter-cell。内存管理方面,CD实现了memory borrowing机制,使得一个cell可以暂时的从其他cell里获得内存,如果这种借用受限于容错性,就只能使用原来的paging机制了。

CPU管理

CD有两个CPU平衡策略,一个在处理器空闲时发生,另一个定期平衡VCPU的负载。空闲调度时要同时考虑gang scheduling的限制以及因转移破坏的cache/node affinity。而定期的调度则是通过一棵全局的load tree的辅助来实现的。此外还需要一个scalable gang scheduler来保证效率,CD的调度器总是选择优先度最高的gang-runnable VCPU(等待时间最多),然后通过低开销的RPC通知那些拥有(和这个VCPU同属于一个虚拟机的VCPU)的处理器,这些处理器在收到消息后,立即停 止当前正在运行的VCPU,服从同一调度策略。通过这种方式实现的调度就不需要一个全局的管理器了。

内存管理

每个cell都维护了自己的freelist,每次接收请求时都优先分配本地node上的资源。内存借用也很直接,需要借用内存的cell向有空闲内存的cell发个RPC即可,RPC的返回结果是一个machine page的list。

测试结果

测试中CD是作为kernel process跑在IRIX 6.4上的,也就是说VMM的下面还有一层操作系统,主要是为了利用IRIX提供的设备驱动。CD在每个CPU上跑一个线程,完全占有整个CPU,IRIX只在需要设备驱动时才被激活。

测试比较了两个测试环境,跑在真机上的IRIX 6.4(增加了多核支持),和跑在CD上的IRIX 6.2。最后的结果显示大部分情况下(单核、8核、32核)后者和前者的差距在10%以内,最差情况下也只有20%的overhead。接下来的容错机制 的overhead同样很小,不高于2%。