多臺工作站搭建MPI並行環境

因爲所作研究工作計算量真是太大了,一臺z840的48核工作站還是感覺有點慢,所以就想着自己搭建一個小的集羣環境,正好辦公室裏面有臺人家不用z800,所以就拿過來試了一下。

折騰了兩天,終於在兩臺hp z840和z800裝有centos7的工作站上搭建好了MPI並行環境。還是有很多地方需要注意的,稍有不慎,就會發生錯誤。下面對這兩天的工作進行一下總結,就算拋磚引玉吧。。。

首先呢,兩臺裝有linux的工作站得相互之間能夠進行通信,我採用直連的方式,因爲工作站一般有兩個網口(兩張網卡),所以我就用z840的一個網口接內網,一個網口接外網,兩張網卡使用nat服務(其實就是對防火牆進行配置)進行橋接,這樣兩臺計算機就都能上外網了,把買交換機或者路由器的錢省下了,而且相對安全,處在內網上的計算機是在z840建的局域網中,外面是訪問不到的。至於nat服務這裏就簡單放兩個命令吧:

設置局域網IP、網段、子網掩碼、網關這些不用多說了吧,計算機進入中國好多年了,不會設置的有點對不起國家這些年對計算機的大力發展呀,回去趴被臥好好哭一場吧。

命令如下
 

iptables -t nat -A POSTROUTING -j MASQUERADE -o enp5s0 (這個是目標網卡,即連接外網的網卡)

iptables -F

iptables -X

這樣另外一臺計算機就可以上外網了。

另外需要多說一點的是,由於centos默認情況下只有一個顯卡是開機自啓的,而我這顯示器也最多隻能接兩臺,(北京地價大家都知道的,能省一分是一分), 我就把兩臺顯示器都接到了z840上面,不是我偏心,畢竟z800是臺slave,用不用顯示器都無所謂的。這樣就造成一個問題,就是如果我重新啓動z800,系統啓動起來了,但是網卡沒啓動起來,這樣遠程連接又控制不了,又得折騰找顯示器整,太麻煩,所以得設置網卡開機自啓,具體修改方法如下

修改/etc/sysconfig/network-scripts/ifcfg-enpxxxxxx(xxx)文件,其內容原本如下

TYPE=Ethernet
BOOTPROTO=dhcp
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s31f6
UUID=f0feed49-a691-4081-b8cb-22226eab82d3
DEVICE=enp0s31f6
ONBOOT=no //把no改成yes就開機自啓了

另外如果需要配置靜態地址,也可以通過修改該文件

如果想要自己設置靜態ip,需要在上邊文件的最後添加以下內容:

 

IPADDR=192.168.7.106 #靜態IP  
GATEWAY=192.168.7.1 #默認網關  
NETMASK=255.255.255.0 #子網掩碼  
DNS1=192.168.7.1 #DNS 配置

使用 service network restart 命令重啓網卡服務即可聯網。

兩臺機器相互通信正常了,下面就得相互間可以免密訪問,因爲MPI是基於ssh服務,而我們平時的遠程連接是需要輸入賬戶,密碼的,你想呀,在進行MPI通信的時候,一臺計算機計算得到的數據要傳輸到主機上,總不能每次都得輸入帳號、密碼吧,所以得賬戶之間做個免密處理,具體方法如下:

首先用來搭建環境的兩臺主機的主機名不能一樣(注意:是主機名,不是用戶名),默認情況下,不進行設置,一般主機名是localhost域名爲localdomain,可以通過查看/etc/hostname或者/etc/hosts文件進行查看,應爲MPI是通過主機名進行連接的而不是用戶名。如果主機名仍然都是localhost的注意了,需要進行更改,更改方法如下:

1、手動更改 /etc/hosts文件,把舊的主機名刪除,保存文件就行了,但是不僅僅只有這一個文件需要修改,還有一些,不知道的可以去網上查一查;

2、利用hostnamectl命令進行主機名稱的修改,具體命令如下

 hostnamectl set-hostname <newhostname>

當然是在超級用戶權限下,這條命令會刪除/etc/hostname文件中的主機名,然後替換爲新的主機名。和第一種方法一樣,我們也需要更新/etc/hosts文件,這兩種方法的本質是一樣的。

3、hostname進行臨時修改,具體命令如下

hostname <new-hostname>

這條命令不會更改/etc/hostname文件中的靜態主機名(static hostname),它更改的只是臨時主機名(transient hostname)。所以重啓計算機後會回到舊的主機名。

各臺機器的主機名配置好了以後,下面就開始配置各個節點的登陸權限了

(1)host配置(所有節點)

超級用戶權限下打開/etc/hosts文件

在hosts文件中添加所有節點的IP地址和相應的主機名稱,比如我這是兩臺機器進行互聯,配置如下
 

192.168.10.250 master(主機IP 主機名)
192.168.10.252 slave(主機IP 主機名)

然後保存,在沒臺機器上均進行同樣的設置,最後可以用ping命令測試是否連通

(2)集羣機器的ssh登陸權限配置

對每一個節點(我這裏是兩臺計算機),分別生成公鑰和私鑰,命令如下

cd ~/.ssh/                     # 若沒有該目錄,請先執行一次ssh localhost
ssh-keygen -t rsa              # 會有提示,接着連按3次回車
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #將自己的公鑰追加到authorized_keys裏

對每一臺機器均作上述處理,然後將生成的id_rsa.pub都傳到一個節點的.ssh目錄中,然後用cat命令全部追加到authorized_keys文件中,然後將該文件分別傳送到每一臺機器的相應目錄下。如果還不明白,參照https://my.oschina.net/zctzl/blog/1560593

然後對ssh免密登陸進行測試,在命令行中輸入指令

ssh slave
ssh master

如果沒有密碼登陸,則表示ssh免密登陸成功。但是大多數情況下沒有這麼順利,如果出現了密碼登陸界面,請檢驗追加的公鑰是否正確,若還是不行請確保ssh服務開啓。同時查看相應文件是不是配置正確,這裏列出相對應的參數

打開/etc/ssh/sshd_config

作如下修改

        RSAAuthentication yes # 啓用 RSA 認證

        PubkeyAuthentication yes # 啓用公鑰私鑰配對認證方式

        AuthorizedKeysFile .ssh/authorized_keys # 公鑰文件路徑(和上面生成的文件同)

然後重新啓動ssh服務

/bin/systemctl restart sshd.service

另外還有一個很重要的問題,是我總結出來的,如果想直接通過ssh 主機名的方式進行免密登陸,需要每個節點的用戶名是一樣的,因爲通常情況下,用ssh登陸其他用戶一般都是ssh 用戶名@主機名的形式,如果直接用ssh 主機名這種方式,默認情況下用戶名是當前用戶名,所以如果是這樣是登陸不上去的,巧合的是,可以通過修改./ssh文件夾下的config文件來對主機用戶進行標定,格式如下(以我的機器爲例),

將master主機下的config文件改爲

Host slave (主機名)

user slave (用戶名) 就是說用master來連接slave的話,用戶名是slave(我的slave主機用戶名就是slave)

將slave主機下的config文件改爲

Host master

user master (與上面同理)

就是能夠讓主機互聯就是了,不懂的可以摸索一下。

(3)mpich的安裝

安裝就不用多說了把,mpich已經相當成熟,不存在一些軟件安裝時候需要各種庫,各種依賴,安裝包裏面也有說明文件,README,這裏就不再多說了。但是尤其需要注意的一點是,所有機器的mpich需要安裝到同一個目錄下比如裝在/usr/local下就全部裝在這個路徑下,因爲運行並行程序的時候,發送的可執行文件的地址就是相同的,如果你裝在/home/username下,由於每臺機器的用戶名不一樣,這樣發送任務會失敗。(尤其注意這一點)經常出現/hydra_pmi_proxy:no such file or directory等

(4)程序測試

按照上面的要求安裝完成以後,原則上是可以運行並行程序了,但是有一點,MPI要求再每臺機器下面都要有相對應的可執行文件以及參數文件等,就是說每次運行程序前都要把參數文件、可執行文件放在相同的目錄下,這樣的話就太麻煩了,尤其是參數文件比較大的時候。因此這裏需要一種只對文件複製一次,然後其他計算機再用的時候過來讀就行了,這種可以通過NFS文件系統進行實現。具體實現過程如下

(5)創建NFS文件系統

如果不進行這一步mpi程序也可以正常運行,但是需要保證在每個節點上的相同路徑下都有可執行文件,所以每次都要把可執行文件進行遠程拷貝,非常麻煩!也可以參照https://blog.csdn.net/coolwubo/article/details/60779933。

服務端:master(192.168.10.250)

客戶端:slave(192.168.10.252)

1、服務端安裝配置

        安裝nfs-utils和rpcbind,centos直接yum install即可

創建共享目錄

mkdir dir  這裏需要說明的是dir具有其他用話的讀寫權限

        配置/etc/exports

#參數說明
#rw:read-write,可讀寫;
#ro:read-only,只讀;
#sync:同步寫入(文件同時寫入硬盤和內存),適用在通信比較頻繁且實時性比較高的場合
#async:異步寫入(文件先寫入內存,稍候再寫入硬盤),性能較好(速度快),適合超大或者超多文件的寫入,但有數據丟失的風險,比如突然斷電等情況;
#注意:除非特別有需要,否則不建議使用 async。如果沒有指定 sync 或 async,NFS 服務器在啓動的時候會印出警告信息。
#no_root_squash:NFS客戶端連接服務端時如果使用的是 root 的話,那麼對服務端分享的目錄也使用 root 權限。不安全!
#root_squash:把客戶端 root 身份的 UID/GID (0/0) 對應到服務端的 nobody 用戶去,即服務端使用 nobody 用戶來操作共享目錄;
#all_squash:不論NFS客戶端連接服務端時使用什麼用戶,對服務端分享的目錄來說都是擁有匿名用戶權限;
#anonuid:匿名用戶的UID值,通常是nobody或nfsnobody,可以在此處自行設定;
#anongid:匿名用戶的GID值。

 

        啓動服務,並設置開機啓動

sudo service rpcbind start
sudo service nfs start
sudo chkconfig --level 2345 rpcbind on
sudo chkconfig --level 2345 nfs on

 

        2.客戶端配置

sudo yum -y install nfs-utils rpcbind

        創建目錄

sudo mkdir dir   //dir的要求同上

        查看服務端共享目錄

showmount -e 192.168.10.250

        掛載共享目錄到本地,並測試讀寫:

 

sudo mount -t nfs 192.168.10.250:/dir /dir
#最開始,我將共享目錄放在/home/mpiuser下的dir文件夾內,雖然dir的權限爲777
#但是由於其父目錄(即用戶目錄mpiuser)的權限爲700,所以掛載時遇到服務器拒絕訪問的問題
#於是我將共享目錄放在根目錄下,並將其權限設置爲777,否則需要增加用戶目錄的訪問權限
cd /dir && touch test

        設置開機自動掛載:

 

sudo vim /etc/fstab
10.10.1.1:/mpiShareDir     /mpiShareDir                    nfs     defaults        0 0

        上述步驟完成後,以後只需將mpi程序放在mpiShareDir目錄下就可以直接運行,而不需要使用遠程拷貝。

簡單的運行程序驗證一下,基本上是可以的了。

注意要點

1、多臺機器的防火牆設置

這個至關重要,如果這個出問題,前面作的再對,也找不到原因,很難檢查;

具體見前面nat服務,出現的錯誤常有

引自https://blog.csdn.net/yhsweetlife/article/details/46654181

he@yuanhe:~/nfs_he$ mpirun -f nodes -n 3 ./example1
rank :0 ,source: -1 ,dest: 1
rank :2 ,source: 1 ,dest: 0
Fatal error in MPI_Send: Unknown error class, error stack:
MPI_Send(174)..............: MPI_Send(buf=0x7ffd4cc4db30, count=5, MPI_INT, dest=1, tag=5, MPI_COMM_WORLD) failed
MPID_nem_tcp_connpoll(1832): Communication error with rank 1: Connection refused


===================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   PID 18691 RUNNING AT yuanhe
=   EXIT CODE: 1
=   CLEANING UP REMAINING PROCESSES
=   YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
===================================================================================
[proxy:0:1@centos] HYD_pmcd_pmip_control_cmd_cb (pm/pmiserv/pmip_cb.c:885): assert (!closed) failed
[proxy:0:1@centos] HYDT_dmxu_poll_wait_for_event (tools/demux/demux_poll.c:76): callback returned error status
[proxy:0:1@centos] main (pm/pmiserv/pmip.c:206): demux engine error waiting for event
[mpiexec@yuanhe] HYDT_bscu_wait_for_completion (tools/bootstrap/utils/bscu_wait.c:76): one of the processes terminated badly; aborting
[mpiexec@yuanhe] HYDT_bsci_wait_for_completion (tools/bootstrap/src/bsci_wait.c:23): launcher returned error waiting for completion
[mpiexec@yuanhe] HYD_pmci_wait_for_completion (pm/pmiserv/pmiserv_pmci.c:218): launcher returned error waiting for completion
[mpiexec@yuanhe] main (ui/mpich/mpiexec.c:344): process manager error waiting for completion
 

2、免密登陸的用戶名設置

一般我們再設置用戶名的時候不會設置成相同的的,這個時候就需要仔細設置一下./ssh/config文件,否則沒有辦法直接通過ssh 主機名進行免密登陸

3.NFS文件系統的權限設置,所有機器都必須對這區域有讀寫權限,經常出現的錯誤如下

引自http://www.heminjie.com/system/linux/2998.html

NFS是非常通用和簡單的Linux下共享協議,但是最近安裝了一次,在另一臺CentOS用mount掛載時卻出現“access denied by server while mounting”這個錯誤;
 
因爲之前配置過很多次NFS了,都沒出現過一點問題,於是先試試在本機mount掛載,測試可以掛載,但是在另一臺機器上卻報錯,首先想到的是iptables防火牆問題,於是關閉防火牆,也一樣報錯。
 
去網上搜索了一下,遇到這個錯誤的人也很多,但是原因都不大相同,在這裏我就總結一下出現此錯誤的幾種原因:
 
1、使用了非法端口,也就是使用了大於1024的端口。
這個錯誤,可以通過查看日誌確認:
[root@local~ /]# cat /var/log/messages | grep mount
Jan 2 12:49:04 localhost mountd[1644]: refused mount request from 192.168.0.100 for /home/nfsshare/ (/home/nfsshare): illegal port 1689
 
解決辦法:
修改配置文件/etc/exports,加入 insecure 選項,重啓nfs服務,再嘗試掛載。
/home/nfsshare/  *(insecure,rw,async,no_root_squash)
 
2、NFS版本問題
編輯/etc/sysconfig/nfs文件,找到下面:

#Turn off v2 and v3 protocol support 
#RPCNFSDARGS="-N 2 -N 3" 
#Turn off v4 protocol support 
#RPCNFSDARGS="-N 4"  /*把這句前面的#號去掉*/

最後保存,重啓nfs服務,再嘗試掛載;如果掛載不上,可嘗試在後面加-o nolock參數。
 
3、查看客戶端掛載的目錄是否具備讀寫權限,添加相應權限即可。
 
4、nfs服務器上的/etc/hosts中設置了客戶端機器IP對應域名,去掉即可。
 
通過以上這幾種方法,access denied by server while mounting這個錯誤應該可以得到解決了。

/////就介紹這麼多了,這是我再實際操作中遇到的問題,希望能幫到大家!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章