MPI并行计算环境搭建以及集群测试

转自:http://wuyanzan60688.blog.163.com/blog/static/12777616320132851924235/

    MPI作为一种通过消息传递进行并行计算的框架,在很多科学计算上有很重要的应用,这次因为GraphLab环境搭建时的需要,花了三个来小时的时间进行了初步的搭建摸索,感觉很有意思!

首先是单机MPI安装
1.安装之前
因为是集群测试,所以跟hadoop一样先要设置ssh无密钥登录(可以参考 这里),我这里用的是一个服务器节点和一台虚拟机。
上面给出的链接里对ssh无密钥登录设置说的很清楚。
2.开始安装
源码下载地址,这里我用的是1.0.8(mpich命名很怪气,明明是v2,它却命名是1,无力吐槽)
mpich2-1.0.8.tar.gz
单机安装很简单

#tar -zxvf mpich2-1.0.8.tar.gz

#./configure (我让它默认安装到/usr/local/bin下,不需要设置安装路径)

#make

#make install

注意: 对于集群的每一个机器都要安装,当然你如果用NFS挂载也可以,我没这样用。
安装完成之后最重要的一步有人说是设置环境变量,其实你默认安装路径的话,这个变量设置与否无所谓的。因此最重要的一步是创建配置文件(mpd.conf)。

#touch /etc/mpd.conf

#chmod 600 /etc/mpd.conf

#echo secretword=myword >> /etc/mpd.conf

到此为止,单机安装就算完成了,可以进行单机测试

# mpd &
[1]4457
# mpdtrace
vm4
# mpdallexit

3.集群部署
集群部署就多一步,只需要在主机种创建集合文件(mpd.hosts),文件地方无所谓,内容为集群的hostname列表。

node9 #主服务器

vm4 #子节点

在主机中测试部署是否成功:

# mpdboot -n 2 -f /root/mpd.hosts
# mpdtrace
node9
vm4

说明部署成功。
4.样例测试
icpi是已经经过编译的可执行文件,用于计算pi的值。( 注意这里服务器和子节点中icpi放的地方要相同
单机

# ./icpi
Enter the number of intervals:(0 quits)10000000000
pi is approximately 3.1415926535895782,Erroris0.0000000000002149
wall clock time =45.378959
Enter the number of intervals:(0 quits)1000
pi is approximately 3.1415927369231227,Erroris0.0000000833333296
wall clock time =0.000149

集群

[root@node9 wyztest]# mpiexec -n 2 ./icpi
Enter the number of intervals:(0 quits)10000000000
pi is approximately 3.1415926535895737,Erroris0.0000000000002194
wall clock time =22.696655
Enter the number of intervals:(0 quits)0

Enter the number of intervals:(0 quits)1000
pi is approximately 3.1415927369231254,Erroris0.0000000833333322
wall clock time =0.001589

测试结果表明:对于间隔比较大时,明显集群快,但是间隔很小时,由于消息传递机制本身会耗时,因此集群效率不如单机。
部分参考资料链接:
http://blog.sina.com.cn/s/blog_5daeb2750100z3qx.html
http://blog.csdn.net/logwt/article/details/7325314
http://www.cnblogs.com/lyq105/archive/2010/06/01/1749515.html
http://blog.csdn.net/ngvjai/article/details/8000045
补充:(可能会出现的问题,这是我在再次部署的时候出现的问题,第一次部署的时候太顺利了,因此没有出现问题,第二次再部署的时候出现了如下四个问题。)
问题1

/usr/local/bin/mpdlib.py:8:DeprecationWarning:The popen2 moduleis deprecated.Use the subprocess module.
import sys, os, signal, popen2, socket,select, inspect
/usr/local/bin/mpdlib.py:15:DeprecationWarning: the md5 moduleis deprecated;use hashlib instead
from md5 importnewas md5new

原因:python版本太高了,python2.6开始都不支持popen2模块,转而用subprocess模块代替,因此会出现这个错误。
解决办法是降低python的版本,转到python2.5之后就可以了。( 源码下载
问题2

#ssh node2

ssh: node2: Temporary failure in name resolution

#ssh 192.168.169.2 则成功

原因:/etc/hosts中配置不完全
解决办法: 两端都需要配置如下:

192.168.168.9 node9
192.168.169.2 node2

问题3

[root@node9 source]# mpdboot -n 2 -f /root/mpd.hosts
mpdboot_node9 (handle_mpd_output 401): failed to connect to mpd on node2

原因:防火墙的问题,node2中防火墙禁止node9进行mpd连接
解决办法:我直接将node2中端口关掉了

[root@node2 .ssh]# iptables -F
[root@node2 .ssh]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

或者你可以参考 这里,这个连接的第二个问题就是教你如何解决防火墙禁止mpd访问的。
问题4

mpiexec_node9 (mpiexec 392):no msg recvd from mpd when expecting ack of

你可能感兴趣的:(并行计算)