最近在mac的ubuntu虚拟机中用docker搭建mpi的运行环境,各种Google也没找到特别好的教程,尤其是遇到各种非常其他的问题,折腾了三四天终于把环境搭建完毕,这里将我遇到的问题和详细步骤记录下来,仅供大家作为参考,我下一步将使用linpack对性能进行测试。
1.docker的安装和命令学习
docker作为一个开源的应用容器引擎,是操作系统上的虚拟化技术。虚拟化可以划分为硬件虚拟化和操作系统虚拟化,硬件虚拟化比如阿里云、VMware、Virtualbox等,操作系统虚拟化就是将多个不同的进程封装在一个密闭的容器中,这就是容器化技术,docker就是其中的佼佼者。推荐一篇对docker的理解和一篇对容器操作的文章,http://blog.csdn.net/zjin_hua/article/details/52041757和http://blog.chinaunix.net/uid-10915175-id-4443127.html。
docker的安装在官网上有详细的教程https://docs.docker.com/engine/installation/linux/ubuntulinux/,一定要按照一步一步按照操作来就可以,我的虚拟机系统是ubuntu14.04 server ,server比较轻量级。安装完成后运行docker run ubuntu /bin/echo 'Hello world'测试安装是否成功,docker --version查看版本
2.制作openmpi的image
我选择在别人的openmpi的镜像基础上安装自己需要的东西后制作成自己的镜像,在docker hub中找到hmonkey/openmpi14.04,登陆后直接输入这个搜索就可以找到,然后pull下来,我选择的是V3版本,然后再docker中执行docker pull hmonkey/openmpi14.04:v3,至此拥有了一个基本的image文件了。
启动四个个节点:
sudo docker run -ti --name master --privileged=true hmonkey/openmpi14.04:v3 /bin/bash
sudo docker run -ti --name slave1 --privileged=true hmonkey/openmpi14.04:v3 /bin/bash
sudo docker run -ti --name slave2 --privileged=true hmonkey/openmpi14.04:v3 /bin/bash
sudo docker run -ti --name slave3 --privileged=true hmonkey/openmpi14.04:v3 /bin/bash
容器和宿主机来回切换的方式有四种,我习惯用docker -exec和ssh切换操作,但是有文章强烈反对使用ssh来回切换操作,建议自行google一下。
docker images查看已经有的image,docker ps -a查看所有的容器。docker ps -l刚运行的容器,可以查看几个容器是否启动起来。
如果容器已经存在可以使用:docker start master开启容器
如进入运行中的master容器:docker exec -ti master /bin/bash
退出容器同时停止:exit
退出不停止容器:Ctrl+P+Q(注意按键顺序)
3.每个节点都安装网络文件系统nfs
安装nfs可以实现节点之间文件的共享,一些代码和软件包可以不用重复下载。在安装nfs遇到问题往往是因为源地址不对,执行sudo apt-get update更新一下就可以。如果这条命令不能执行,则是因为源地址错乱,需要删除原来的文件。
sudo apt-get install nfs-kernel-server 安装nfs ,
如果后面文件挂在是报mount wrong nfs type, bad option, bad superblock on XXX 的错误。则是没有自动安装nfs-common的原因,需要安装
sudo apt-get install nfs-common,然后在主节点上配置需要共享文件夹:
/etc/exports文件,在最后一行,加上这么一句。
"/home/monkey/nfs" *(rw,sync,no_subtree_check) 当然monkey/nfs文件夹需要自己创建。
sudo /etc/init.d/nfs-kernel-server restart就可以了。我们可以输入showmount -e来进行查看。我是在宿主机器上配置的共享文件,也可以在主节点master上进行配置。
4.每个节点安装和启动ssh免密登陆
进入每一个节点,sudo apt-get install openssl-server 安装ssh ,然后制作免密登陆
ssh-keygen -t rsa -P ""生成公钥
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 追加到文件
ssh localhost 测试
启动ssh服务:sudo service ssh start 自带的vi编辑器比较混乱 最好给节点装个vim,sudo apt-get vim
然后在每个几点进入/etc/hosts文件中配置其他节点的ip地址: 这里还有一个节点,测试矩阵分解需要四个节点,自行加入即可。
5.共享文件挂载
这个过程会出现各种问题,每个人遇到的问题应该都不太一样,大家自行解决吧。首先在在/etc/fstab中加入挂在地址和文件:
在/etc/fstab 下面添加如下一句话
XX.XX.XX.XX:/home/monkey/nfsnfs nfsdefaults 0 0
更改文件夹nfs的权限:
chmod 755 /nfs
重启:sudo /etc/init.d/nfs-kernel-server restart
然后就可以对文件进行挂载:
mount -t nfs ip地址:/home/monkey/nfs /nfs
6.准备测试程序
从github找一个测试程序,MPi测试程序很多,这里找了一个比较全的,在共享的文件夹下面去clone,就不用每个节点都进行拷贝了
mkdir mpiExample
cd mpiExample
git clone https://github.com/preimmortal/MPI.git
解决找不到github.com主机的问题:
主要是因为在Google的hosts文件中设置了github的代理,可以找到 注释掉下面 重启机器
# Github start
#192.30.252.141gist.github.com
# Github end
解决2:取消代理设置(重启机器或者虚拟机)
git config --global --unset http.proxy
https version:
git config --global --unset https.proxy
需要输入github的账号和密码
ps:各节点的执行代码位置一定要放置在相同的地方
cd MPI/array_decomposition
mpicc -o mpi_array mpi_array.c
多出的mpi_array就是可执行的文件
OK 回到master节点创建hostfile,在hostfile文件中配置其他节点ip就可以了
cd MPI/array_decomposition
touch hostfile
vim hostfile 添加IP地址的格式如下:
7.测试矩阵分解
执行:mpirun -n 4 -hostfile hostfile moi_array
大功告成!!期间会出现各种奇葩的问题,一个一个慢慢解决就好了!