回首单核处理器走过的峥嵘岁月,那时的高性能计算集群还处在萌芽阶段,尽可能的获取和硬件相匹配的应用软件是非常重要的。在很多情况下,都是如此。通过使用TCP/IP网络协议或者用户空间零拷贝协议的操作系统实现节点间通信。除了阻止内存之外,用户空间协议从节点通信中移除了操作系统。用户空间通信的结果就是使应用软件的性能得到了提升。

为了弄明白虚拟化在高性能计算中扮演的角色,先让我们看看程序是如何在集群中运行的。一个MPI并行程序基本可以理解为在统一或者不同节点上运行的独立程序的集合。Messages的作用就是把内存从一个程序拷贝到另外一个程序。然后通过计划程序(比如PBS,分布式计算或者Torque)分配到空闲状态下的节点或者内核上去。这些程序通过全知调度程序进行管理,一旦分配到内核上,就会停留在上面直到完成。这些节点通信都是在互联网上完成的,但是就调度程序而言,如何处理好这些节点才是用户的任务所在。这个模式对于高性能计算集群非常适用,尽管它并非唯一。

虚拟化能允许操作系统实例(OS instance)在管理程序之上运行。因为管理程序能够将操作系统实例(OS instance)与硬件分开,而这个硬件能允许操作系统和运行程序从一个管理程序迁移到另外一个管理程序。

让我们考虑一下是否需要取消一个服务器来固定或者增加驱动呢?先从虚拟化服务器说起,移动客户端实例,固定机器然后继续移动。客户端操作系统并不会意识什么正在发生。这就好比管理程序是电灯插座,操作系统实例(OS instance)就是电灯,会以不同的形式变化比如颜色或者瓦特数,但是他们都可以安装在同一个插座上。因此我们所做的就是移动电灯,这么做就容易多了。

在虚拟化的世界里,有两种方法来移动这个电灯。一种就是关掉电灯,旋开螺丝(可能需要花费一些时间)然后把它安装在新的插座上。另外一种方法就是在电灯开着的时候就进行移动(对我而言,这是个经过认真思考的试验,并非没有可能),如果你以非常快的速度旋开电灯的螺丝在电流停止流动之前就安装在新的插座上(请注意,这里用的是"非常快"),那么没有人会意识到电灯曾经熄灭过。

为了更好的运用虚拟化,需要在硬件上增加一个抽像化层。如果你对集群只是一知半解,那么就要在你们的脑子里敲响警钟了。抽像化层位于上层。在高性能计算中我们需要上层最小化,因为我们需要尽可能的接近硬件的需求。虚拟化是需要成本的。另外,单一操作系统实例的迁移也是要一些小技巧的。但是通过MPI并行程序同步或者异步通信来迁移多冲操作系统实例就要增加抽像化层的难度了。

对于上层这个问题,高性能计算的虚拟化也是颇具诱惑力的。具备迁移运行中的MPI/OS实例的能力也是可能的。

首先,check-pointing节点实例就是一种可能性。只是把每个操作系统实例放在磁盘上。同样的,整个集群进行区域筛选分类聚集工作,然后稍后运行或者在其它的节点上运行。当然,check-pointing和区域筛选分类聚集法都是什么新的想法,不过在一个集群环境中进行也不是那么容易的事。

另外一种可能性是运行单一节点实例。假设你的代码要求不被其它节点使用的特殊内核,libc或者操作系统版本。没问题!先从你需要的节点操作系统实例开始着手。最后,调度程序会和操作系统实例配合进行迁移来帮助实时加载集群平衡。

也许你会注意到,我有意在掩盖许多细节而只是从大面上进行叙述。我了解到的细节其实也是非常重要的。虚拟化还比较昂贵而且有待更加成熟。我们目前知道的是处理器和网络速度变的更快,内核的数量能够更多,内存体积也在增长。不过今天的昂贵并不意味着以后也会昂贵。虚拟化为高性能计算打开了传输的媒介。