最近想要投IEEE Cloud 这个会议,因此需要做一些实验。为了比较节点之间的通信性能,采用了MPI benchmark来作为基准的测试程序
实验采用的是NASA的NPB(NASA Parallel Benchmark)。实验平台是Plane-Lab。由于涉及到了MPI程序,因此要用到MPI类库。之前一直用的是MPICH,但是Planet-Lab的安装源没有MPICH只有Open MPI只好该有后者了!
由于是刚接触Open MPI, 因此在整个实验中碰到了一些问题,最后终于解决了。现在把这些问题及解决方列出来:
1.安装Open MPI
由于,Planet-Lab源上有,所以直接yum就好了。如果没有可以手动下载源代码编译,不过要手动解决一来问题。。。
sudo yum install openmpi
2.MPI程序的运行
如果是在单一节点上:
mpirun -np n exe
n 是进程个数,exe是执行文件的名字。
如果是多个节点:
mpirun -hostfile hostfile -np n exe
hostfile 是参与计算的节点列表。其格式如下:
ip1
ip2
ip3
上面的命令,则本地节点也会参与运算,不推荐这样(本地节点复制调度最好),可以采用如下方法:
mpirun -nolocal -hostfile hostfile -np n exe
则可以让本地节点不参与计算。
一般来说mpi程序都是部署在集群上运行的,但是我的节点是都是部署在internet环境下,因此有很多意想不到的错误发生:
ip1[0,1,0]:connect() failed with errno=110
ip2[0,1,1]: connect() failed with errno=110
具体的错误原因可以用查看:
$: perl -e 'die$!=110 |
从错误来看是超时错误,然后网上搜索下,又不会少人都是这个问题,他们的程序都是运行在集群上。
从搜索结果总结出,问题的原因是:节点具有多个网卡、多个节点共享一个ip(局域网很常见)。
解决这个问题可以通过设置MCA参数。通过查阅MCA文档终于找到解决的办法:
--mca btl_tcp_if_include eth0
改参数定义了强制使用第一块网卡来通信!最后整个命令如下:
mpirun -hostfile hostfile --mca btl_tcp_if_include eth0 -np n exe
另外还有不少错误事mca参数设置造成的,可以通过mca参数更改来搞定。如果不想每次运行都输入mca参数。可以在
$home/.openmpi/mca-params.conf 中直接定义:
oob_tcp_include=eth0
btl_tcp_if_include=eth0
关于mca详细的定义可以参考:
http://docs.sun.com/source/819-7480-11/mca-params.html#50634789_63357