最近在研究docker,早些时候老板让做了一个open mpi的image,并在单机环境下,成功使用docker搭建了一个openmpi的集群,可以跑一些hello world的例子,后来,在ubuntu环境下,使用openvswitch搭建了一个多host的集群,在coreos环境下,使用etcd键值对服务和搭建了一个集群,并分别通过tunnel的方式,和flannel的方式,修改docker -d的参数,使得,在不同的host主机上,可以运行在同一个子网内的container,并且相互之间可以通信。(好像我还没有来得及记录下来怎么做的)。前几天老板说,你成功搭建了,跑hello world的例子也成功了,但是你这个性能怎么样,多host情况下,你是通过tunnel桥,或者flannel实现的,那么你这样的性能和单host肯定是不一样的,性能差多少呢?你要找个benchmark来检验一下,所以,我就找了个openmpi的mtt来测试一下,这里做个记录。
我们先来说说mtt是个什么东西,mtt是一个检验mpi环境的,不只是openmpi,包括别的版本的mpi也是可以的。第一,mtt会检验你是否正确安装了mpi,甚至mtt可以帮助你安装mpi。第二,mtt会检验你写的代码是否可以通过安装的mpi成功编译。第三,mtt会检验你写的程序是否可以正确在集群环境中运行,并返回集群中云心的结果,包括是否成功啊,花费的时间等。第三个特点,也正是我们需要的功能。
首先要明确的一个观点就是,肯定要搭建一个nfs,或者说,也可以使用别的方法,比如开个docker container作为data container,然后通过这种方式同步也可以,如果单节点当然可以,但是在多节点的时候就不可以了,因为data container不能跨节点共享数据。我们为什么要在不同节点之间共享数据呢?想象一下,我们在运行mtt的时候,他会运行我们的测试程序,那么这个测试程序,理论上只有在我们运行mtt的host才会有,那么怎么让那些slave节点也去运行这个程序呢?mtt并不帮助我们把测试程序传到slave节点上去,需要我们自己拷贝,或者通过别的简单方式,别如我们刚刚说的通过data container的方式,或者nfs。由于我们需要在不同的host节点上创建slave,所以我们这里肯