最近在帮导师做点MPI的东西,虽然耽误了一些自己看游戏开发书籍的时间,但还是收获挺多的,至少加强了敲linux命令和环境配置的能力。下面分享下今天配置MPICH2高性能集群计算环境心得,希望对初配MPI环境的童鞋有点指引。
一、说明
在Linux环境中安装MPICH2集群环境需要安装以下软件:
(1)linuxgcc;
(2)linuxg++;
(3)NFS(服务器端);
(4)SSH;
(5)MPICH2;
特别注意:安装MPICH2环境要用到SSH,为保证集群机的一致性,要在每台机器上建立一个相同用户名的用户,我们以“josh”为例,并且在josh目录下做相同的软件配置。 由于实验设备限制,我们用两台机器进行集群,分别是josh@josh和josh@tutu。
接下来,将逐步介绍怎样安装和配置这些软件。
二、实验环境
实验中我使用的环境为:
局域网
Ubuntu
mpich2-1.2.1.tar.gz
三、安装及配置
1、安装linuxgcc和g++(所有机器)
直接使用apt-getinstall即可装最新的gcc和g++版本,用于C/C++程序的开发等。
$sudo apt-get install gcc
$sudo apt-get install g++
2、(1)配置server(josh@josh)的网络配置(客户机上网络配置类似,只要修改ip即可)
$sudo gedit /etc/network/interfaces
在文件末尾添加如下内容:
auto eth0
iface eth0 inet static
address 192.168.13.50 #server的ip地址
netmask 255.255.255.0
gateway 192.168.13.254
(2)为服务器配置DNS使其可以上网:
$sudo vim /etc/resolv.conf
向文件中添加:
nameserver 202.116.32.4 #以自己实验室的DNS为例
3、为每台机器配置hosts文件(包括server)
$sudo vim /etc/hosts
先注释掉如下行:
127.0.1.1 josh-Rev-1-0 #不注释掉,无法联机解析,非常重要,之后再将主机名添加到下 #面的别名中即可,所以机器都要这么做
在文件尾添加所有集群机器的ip和别名:
192.168.13.50 node0 josh-Rev-1-0 #把主机名加在这里是正确的
192.168.13.51 node1 tutu-desktop
4、可见192.168.13.50为server,机器信息为josh@josh;192.168.13.51为节点1(node1),机器信息为josh@tutu。接着,在两台机器上ping彼此,看连接是否通。
5、为server安装NFS网络文件系统
$sudo apt-get install nfs-kernel-server nfs-common
(1)案子完成后在/usr/下建立集群共享文件夹cluster:
$sudo mkdir cluster
(2)将cluster文件夹的用户和用户组改为cluster:
$ll /usr/cluster
$sudo chown cluster:cluster /usr/cluster
(3)配置NFSserver的文件共享信息:
$sudo vim /etc/exports
在文件尾添加如下信息:
/usr/clusternode0(rw, sync)
/usr/clusternode1(rw, sync)
6、配置SSH(每台机)
(1)SSH中公匙与私匙原理说明
利用MPICH搭建并行高性能计算环境需要使用SSH协议,SSH为建立在应用层和传输层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
SSH配置成功后,namenode可以使用SSH无密钥登陆并启动datanode进程,同样,在datanode上也可以用SSH无密钥登陆到namenode,datanode之间也可以实现无密钥登陆。也可以在datanode上启动或关闭MPICH。
namenode作为客户端,要实现无密钥验证,连接到服务端datanode上时,需要在namenode上生成一个密钥对,包括一个公钥和一个私钥,然后将公钥复制到datanode上。当namenode通过SSH链接datanode时,datanode就会生成一个随机数并用namenode的公钥对随机数进行加密,并发送给namenode。namenode收到加密数据之后再用私钥解密,并将解密数据回传datanode,datanode确认解密数无误后,就允许namenode进行无密钥验证链接了。这就是公钥认证过程,期间不需要用户手工输入密码。其中关键过程是将客户端namenode的公钥复制到服务端datanode上。
(2)在每台机器上安装SSH
$sudo apt-get install ssh
(3)在每台机(含server)上生成SSH本机秘匙对(一个公匙和一个私匙)
$ssh-keygen-t rsa #一路回车
(4)查看是否生成.ssh文件:
$ls -a
(5)进入.ssh目录:
$cd .ssh
(6)在每台机器的.ssh目录下新建authorized_keys文件:
$touch authorized_keys
(7)此时在各个节点执行:ssh节点主机名,这样系统就可以记住该用户,用户以后在自己主机上执行此命令就不再需要输入密码了;
(8)将每个节点的公钥用scp命令(安全拷贝)传送到另外两个节点:
将node0的拷贝给node1:
$scp -r id_rsa.pub josh@tutu:~/.ssh/publickey_joshjosh
就可以将josh@josh上生成的密钥传到节点josh@tutu用户下,并重命名为pubkey_joshjosh。
同样,将node1的拷贝给node0:
$scp -r id_rsa.pub josh@josh:~/.ssh/publickey_joshtutu
就可以将josh@tutu上生成的密钥传到节点josh@josh用户下,并重命名为pubkey_joshtutu。
(9)在每个节点的.ssh目录下,将另外两个节点传过来的公钥文件的内容复制到本目录下的authorized_keys文件中,并将authorized_keys文件的权限改为600,次步骤非常重要是配置SSH的关键:
在node0上:
$cat public_joshtutu >> authorized_keys
$cat id_rsa.pub >> authorized_keys
$chmod 600 authorized_keys
在node1上:
$cat public_joshjosh >> authorized_keys
$cat id_rsa.pub >> authorized_keys
$chmod 600 authorized_keys
(10)至此SSH配置完毕,二个节点可以彼此使用SSH无密码登录,测试如下:
在node0上:
$ssh node1
在node1上:
$ssh node0
若双方都可以实现无密码登录彼此,则SSH配置成功。
7、安装MPICH2
(1)将MPICH2软件包拷到各机器的/home/josh目录下;
(2)解压缩:
$tar –zxvf mpich2-1.2.1.tar.gz
(3)创建安装目录:
$mkdir /opt/mpich2
(4)进入解压后的软件目录中:
$cd ~/software/mpich2-1.2.1
(5)设置安装目录:
$./configure –prefix=/opt/mpich2
(6)编译
$make
(7)安装
$make install
(8)ok,退出到用户目录
$cd~
(9)配置MPICH2环境
$sudo vim /etc/profile
在文件尾添加如下内容:
PATH=$PATH:/opt/mpich2/bin"
(10)在每台机器上测试环境变量:
$which mpd
$which mpicc
$which mpiexec
$which mpirun
(11)在每台机器的josh目录用户下创建MPD密码文件:
$cd~
$vim ~/.mpd.conf
在文件中添加如下内容:
MPD_SECRETWORD=myword
改变.mod.conf文件权限:
$chmod600 ~/.mpd.conf #这个权限很重要,一定要是600
(12)在每台机器的josh用户目录下创建集群机器名称集合(用于启动集群时用):
$vim ~/mpd.hosts
在文件中添加如下内容:
node0
node1
至此所以配置基本完成,接着可以测试了。
8、测试
(1)考虑到联机环境,测试程序的存放路径一定要相同。我将测试程序放在/home/josh/TestMPI/下,保证每台机器都这样。将MPICH2的examples中的程序cpi.c拷贝到所有机器的TestMPI目录下。因为每台机器的硬件环境不同,所以待测试的源程序需要分别在自己的机器上编译。
(2)源文件编译后,在每台机器上进行单机测试
$mpd& #单机启动方法
$mpiexec -n 10 ~/TestMPI/cpi #用10个进程运行
$mpdallexit退出
截图如下:
(3)集群运行前确保每台机都各自编译过源程序,在任一台上测试集群运行案例
$mpdboot -n 2 -f mpd.hosts #启动2台机器
$mpiexec -n 10 ~/TestMPI/cpi #用10个进程运行
$mpdallexit
截图如下:
网上关于MPICH的配置页面很多,但许多博主并没把配置中重要的地方说清楚,这里给出以下两个链接页面,是我筛选后认为比较好的,我在配置实验环境中也遇到率很多问题,参考了他们的说明基本理解和解决率,谢谢!
http://www.linuxidc.com/Linux/2011-12/49313.htm
http://hi.baidu.com/coolrainbow/item/9804323fe53240f5df22214d