多台工作站搭建MPI并行环境
因?yàn)樗餮芯抗ぷ饔?jì)算量真是太大了,一臺(tái)z840的48核工作站還是感覺(jué)有點(diǎn)慢,所以就想著自己搭建一個(gè)小的集群環(huán)境,正好辦公室里面有臺(tái)人家不用z800,所以就拿過(guò)來(lái)試了一下。
折騰了兩天,終于在兩臺(tái)hp z840和z800裝有centos7的工作站上搭建好了MPI并行環(huán)境。還是有很多地方需要注意的,稍有不慎,就會(huì)發(fā)生錯(cuò)誤。下面對(duì)這兩天的工作進(jìn)行一下總結(jié),就算拋磚引玉吧。。。
首先呢,兩臺(tái)裝有l(wèi)inux的工作站得相互之間能夠進(jìn)行通信,我采用直連的方式,因?yàn)楣ぷ髡疽话阌袃蓚€(gè)網(wǎng)口(兩張網(wǎng)卡),所以我就用z840的一個(gè)網(wǎng)口接內(nèi)網(wǎng),一個(gè)網(wǎng)口接外網(wǎng),兩張網(wǎng)卡使用nat服務(wù)(其實(shí)就是對(duì)防火墻進(jìn)行配置)進(jìn)行橋接,這樣兩臺(tái)計(jì)算機(jī)就都能上外網(wǎng)了,把買(mǎi)交換機(jī)或者路由器的錢(qián)省下了,而且相對(duì)安全,處在內(nèi)網(wǎng)上的計(jì)算機(jī)是在z840建的局域網(wǎng)中,外面是訪問(wèn)不到的。至于nat服務(wù)這里就簡(jiǎn)單放兩個(gè)命令吧:
設(shè)置局域網(wǎng)IP、網(wǎng)段、子網(wǎng)掩碼、網(wǎng)關(guān)這些不用多說(shuō)了吧,計(jì)算機(jī)進(jìn)入中國(guó)好多年了,不會(huì)設(shè)置的有點(diǎn)對(duì)不起國(guó)家這些年對(duì)計(jì)算機(jī)的大力發(fā)展呀,回去趴被臥好好哭一場(chǎng)吧。
命令如下
?
這樣另外一臺(tái)計(jì)算機(jī)就可以上外網(wǎng)了。
另外需要多說(shuō)一點(diǎn)的是,由于centos默認(rèn)情況下只有一個(gè)顯卡是開(kāi)機(jī)自啟的,而我這顯示器也最多只能接兩臺(tái),(北京地價(jià)大家都知道的,能省一分是一分), 我就把兩臺(tái)顯示器都接到了z840上面,不是我偏心,畢竟z800是臺(tái)slave,用不用顯示器都無(wú)所謂的。這樣就造成一個(gè)問(wèn)題,就是如果我重新啟動(dòng)z800,系統(tǒng)啟動(dòng)起來(lái)了,但是網(wǎng)卡沒(méi)啟動(dòng)起來(lái),這樣遠(yuǎn)程連接又控制不了,又得折騰找顯示器整,太麻煩,所以得設(shè)置網(wǎng)卡開(kāi)機(jī)自啟,具體修改方法如下
修改/etc/sysconfig/network-scripts/ifcfg-enpxxxxxx(xxx)文件,其內(nèi)容原本如下
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就開(kāi)機(jī)自啟了另外如果需要配置靜態(tài)地址,也可以通過(guò)修改該文件
如果想要自己設(shè)置靜態(tài)ip,需要在上邊文件的最后添加以下內(nèi)容:
?
IPADDR=192.168.7.106 #靜態(tài)IP GATEWAY=192.168.7.1 #默認(rèn)網(wǎng)關(guān) NETMASK=255.255.255.0 #子網(wǎng)掩碼 DNS1=192.168.7.1 #DNS 配置使用 service network restart 命令重啟網(wǎng)卡服務(wù)即可聯(lián)網(wǎng)。
兩臺(tái)機(jī)器相互通信正常了,下面就得相互間可以免密訪問(wèn),因?yàn)镸PI是基于ssh服務(wù),而我們平時(shí)的遠(yuǎn)程連接是需要輸入賬戶(hù),密碼的,你想呀,在進(jìn)行MPI通信的時(shí)候,一臺(tái)計(jì)算機(jī)計(jì)算得到的數(shù)據(jù)要傳輸?shù)街鳈C(jī)上,總不能每次都得輸入帳號(hào)、密碼吧,所以得賬戶(hù)之間做個(gè)免密處理,具體方法如下:
首先用來(lái)搭建環(huán)境的兩臺(tái)主機(jī)的主機(jī)名不能一樣(注意:是主機(jī)名,不是用戶(hù)名),默認(rèn)情況下,不進(jìn)行設(shè)置,一般主機(jī)名是localhost域名為localdomain,可以通過(guò)查看/etc/hostname或者/etc/hosts文件進(jìn)行查看,應(yīng)為MPI是通過(guò)主機(jī)名進(jìn)行連接的而不是用戶(hù)名。如果主機(jī)名仍然都是localhost的注意了,需要進(jìn)行更改,更改方法如下:
1、手動(dòng)更改 /etc/hosts文件,把舊的主機(jī)名刪除,保存文件就行了,但是不僅僅只有這一個(gè)文件需要修改,還有一些,不知道的可以去網(wǎng)上查一查;
2、利用hostnamectl命令進(jìn)行主機(jī)名稱(chēng)的修改,具體命令如下
hostnamectl set-hostname <newhostname>當(dāng)然是在超級(jí)用戶(hù)權(quán)限下,這條命令會(huì)刪除/etc/hostname文件中的主機(jī)名,然后替換為新的主機(jī)名。和第一種方法一樣,我們也需要更新/etc/hosts文件,這兩種方法的本質(zhì)是一樣的。
3、hostname進(jìn)行臨時(shí)修改,具體命令如下
hostname <new-hostname>這條命令不會(huì)更改/etc/hostname文件中的靜態(tài)主機(jī)名(static hostname),它更改的只是臨時(shí)主機(jī)名(transient hostname)。所以重啟計(jì)算機(jī)后會(huì)回到舊的主機(jī)名。
各臺(tái)機(jī)器的主機(jī)名配置好了以后,下面就開(kāi)始配置各個(gè)節(jié)點(diǎn)的登陸權(quán)限了
(1)host配置(所有節(jié)點(diǎn))
超級(jí)用戶(hù)權(quán)限下打開(kāi)/etc/hosts文件
在hosts文件中添加所有節(jié)點(diǎn)的IP地址和相應(yīng)的主機(jī)名稱(chēng),比如我這是兩臺(tái)機(jī)器進(jìn)行互聯(lián),配置如下
?
然后保存,在沒(méi)臺(tái)機(jī)器上均進(jìn)行同樣的設(shè)置,最后可以用ping命令測(cè)試是否連通
(2)集群機(jī)器的ssh登陸權(quán)限配置
對(duì)每一個(gè)節(jié)點(diǎn)(我這里是兩臺(tái)計(jì)算機(jī)),分別生成公鑰和私鑰,命令如下
cd ~/.ssh/ # 若沒(méi)有該目錄,請(qǐng)先執(zhí)行一次ssh localhost ssh-keygen -t rsa # 會(huì)有提示,接著連按3次回車(chē) cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys #將自己的公鑰追加到authorized_keys里對(duì)每一臺(tái)機(jī)器均作上述處理,然后將生成的id_rsa.pub都傳到一個(gè)節(jié)點(diǎn)的.ssh目錄中,然后用cat命令全部追加到authorized_keys文件中,然后將該文件分別傳送到每一臺(tái)機(jī)器的相應(yīng)目錄下。如果還不明白,參照https://my.oschina.net/zctzl/blog/1560593。
然后對(duì)ssh免密登陸進(jìn)行測(cè)試,在命令行中輸入指令
ssh slave ssh master如果沒(méi)有密碼登陸,則表示ssh免密登陸成功。但是大多數(shù)情況下沒(méi)有這么順利,如果出現(xiàn)了密碼登陸界面,請(qǐng)檢驗(yàn)追加的公鑰是否正確,若還是不行請(qǐng)確保ssh服務(wù)開(kāi)啟。同時(shí)查看相應(yīng)文件是不是配置正確,這里列出相對(duì)應(yīng)的參數(shù)
打開(kāi)/etc/ssh/sshd_config
作如下修改
????????RSAAuthentication yes # 啟用 RSA 認(rèn)證
????????PubkeyAuthentication yes # 啟用公鑰私鑰配對(duì)認(rèn)證方式
????????AuthorizedKeysFile .ssh/authorized_keys # 公鑰文件路徑(和上面生成的文件同)
然后重新啟動(dòng)ssh服務(wù)
/bin/systemctl restart sshd.service另外還有一個(gè)很重要的問(wèn)題,是我總結(jié)出來(lái)的,如果想直接通過(guò)ssh 主機(jī)名的方式進(jìn)行免密登陸,需要每個(gè)節(jié)點(diǎn)的用戶(hù)名是一樣的,因?yàn)橥ǔG闆r下,用ssh登陸其他用戶(hù)一般都是ssh 用戶(hù)名@主機(jī)名的形式,如果直接用ssh 主機(jī)名這種方式,默認(rèn)情況下用戶(hù)名是當(dāng)前用戶(hù)名,所以如果是這樣是登陸不上去的,巧合的是,可以通過(guò)修改./ssh文件夾下的config文件來(lái)對(duì)主機(jī)用戶(hù)進(jìn)行標(biāo)定,格式如下(以我的機(jī)器為例),
將master主機(jī)下的config文件改為
Host slave (主機(jī)名)
user slave (用戶(hù)名) 就是說(shuō)用master來(lái)連接slave的話,用戶(hù)名是slave(我的slave主機(jī)用戶(hù)名就是slave)
將slave主機(jī)下的config文件改為
Host master
user master (與上面同理)
就是能夠讓主機(jī)互聯(lián)就是了,不懂的可以摸索一下。
(3)mpich的安裝
安裝就不用多說(shuō)了把,mpich已經(jīng)相當(dāng)成熟,不存在一些軟件安裝時(shí)候需要各種庫(kù),各種依賴(lài),安裝包里面也有說(shuō)明文件,README,這里就不再多說(shuō)了。但是尤其需要注意的一點(diǎn)是,所有機(jī)器的mpich需要安裝到同一個(gè)目錄下比如裝在/usr/local下就全部裝在這個(gè)路徑下,因?yàn)檫\(yùn)行并行程序的時(shí)候,發(fā)送的可執(zhí)行文件的地址就是相同的,如果你裝在/home/username下,由于每臺(tái)機(jī)器的用戶(hù)名不一樣,這樣發(fā)送任務(wù)會(huì)失敗。(尤其注意這一點(diǎn))經(jīng)常出現(xiàn)/hydra_pmi_proxy:no such file or directory等
(4)程序測(cè)試
按照上面的要求安裝完成以后,原則上是可以運(yùn)行并行程序了,但是有一點(diǎn),MPI要求再每臺(tái)機(jī)器下面都要有相對(duì)應(yīng)的可執(zhí)行文件以及參數(shù)文件等,就是說(shuō)每次運(yùn)行程序前都要把參數(shù)文件、可執(zhí)行文件放在相同的目錄下,這樣的話就太麻煩了,尤其是參數(shù)文件比較大的時(shí)候。因此這里需要一種只對(duì)文件復(fù)制一次,然后其他計(jì)算機(jī)再用的時(shí)候過(guò)來(lái)讀就行了,這種可以通過(guò)NFS文件系統(tǒng)進(jìn)行實(shí)現(xiàn)。具體實(shí)現(xiàn)過(guò)程如下
(5)創(chuàng)建NFS文件系統(tǒng)
如果不進(jìn)行這一步mpi程序也可以正常運(yùn)行,但是需要保證在每個(gè)節(jié)點(diǎn)上的相同路徑下都有可執(zhí)行文件,所以每次都要把可執(zhí)行文件進(jìn)行遠(yuǎn)程拷貝,非常麻煩!也可以參照https://blog.csdn.net/coolwubo/article/details/60779933。
服務(wù)端:master(192.168.10.250)
客戶(hù)端:slave(192.168.10.252)
1、服務(wù)端安裝配置
? ??? ? 安裝nfs-utils和rpcbind,centos直接yum install即可
創(chuàng)建共享目錄
mkdir dir? 這里需要說(shuō)明的是dir具有其他用話的讀寫(xiě)權(quán)限
????? ? 配置/etc/exports
#參數(shù)說(shuō)明 #rw:read-write,可讀寫(xiě); #ro:read-only,只讀; #sync:同步寫(xiě)入(文件同時(shí)寫(xiě)入硬盤(pán)和內(nèi)存),適用在通信比較頻繁且實(shí)時(shí)性比較高的場(chǎng)合 #async:異步寫(xiě)入(文件先寫(xiě)入內(nèi)存,稍候再寫(xiě)入硬盤(pán)),性能較好(速度快),適合超大或者超多文件的寫(xiě)入,但有數(shù)據(jù)丟失的風(fēng)險(xiǎn),比如突然斷電等情況; #注意:除非特別有需要,否則不建議使用 async。如果沒(méi)有指定 sync 或 async,NFS 服務(wù)器在啟動(dòng)的時(shí)候會(huì)印出警告信息。 #no_root_squash:NFS客戶(hù)端連接服務(wù)端時(shí)如果使用的是 root 的話,那么對(duì)服務(wù)端分享的目錄也使用 root 權(quán)限。不安全! #root_squash:把客戶(hù)端 root 身份的 UID/GID (0/0) 對(duì)應(yīng)到服務(wù)端的 nobody 用戶(hù)去,即服務(wù)端使用 nobody 用戶(hù)來(lái)操作共享目錄; #all_squash:不論NFS客戶(hù)端連接服務(wù)端時(shí)使用什么用戶(hù),對(duì)服務(wù)端分享的目錄來(lái)說(shuō)都是擁有匿名用戶(hù)權(quán)限; #anonuid:匿名用戶(hù)的UID值,通常是nobody或nfsnobody,可以在此處自行設(shè)定; #anongid:匿名用戶(hù)的GID值。?
????????啟動(dòng)服務(wù),并設(shè)置開(kāi)機(jī)啟動(dòng)
sudo service rpcbind start sudo service nfs start sudo chkconfig --level 2345 rpcbind on sudo chkconfig --level 2345 nfs on?
????? ? 2.客戶(hù)端配置
sudo yum -y install nfs-utils rpcbind????? ? 創(chuàng)建目錄
sudo mkdir dir //dir的要求同上????? ? 查看服務(wù)端共享目錄
showmount -e 192.168.10.250????????掛載共享目錄到本地,并測(cè)試讀寫(xiě):
?
sudo mount -t nfs 192.168.10.250:/dir /dir #最開(kāi)始,我將共享目錄放在/home/mpiuser下的dir文件夾內(nèi),雖然dir的權(quán)限為777 #但是由于其父目錄(即用戶(hù)目錄mpiuser)的權(quán)限為700,所以掛載時(shí)遇到服務(wù)器拒絕訪問(wèn)的問(wèn)題 #于是我將共享目錄放在根目錄下,并將其權(quán)限設(shè)置為777,否則需要增加用戶(hù)目錄的訪問(wèn)權(quán)限 cd /dir && touch test????????設(shè)置開(kāi)機(jī)自動(dòng)掛載:
?
sudo vim /etc/fstab 10.10.1.1:/mpiShareDir /mpiShareDir nfs defaults 0 0????? ? 上述步驟完成后,以后只需將mpi程序放在mpiShareDir目錄下就可以直接運(yùn)行,而不需要使用遠(yuǎn)程拷貝。
簡(jiǎn)單的運(yùn)行程序驗(yàn)證一下,基本上是可以的了。
注意要點(diǎn)
1、多臺(tái)機(jī)器的防火墻設(shè)置
這個(gè)至關(guān)重要,如果這個(gè)出問(wèn)題,前面作的再對(duì),也找不到原因,很難檢查;
具體見(jiàn)前面nat服務(wù),出現(xiàn)的錯(cuò)誤常有
引自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、免密登陸的用戶(hù)名設(shè)置
一般我們?cè)僭O(shè)置用戶(hù)名的時(shí)候不會(huì)設(shè)置成相同的的,這個(gè)時(shí)候就需要仔細(xì)設(shè)置一下./ssh/config文件,否則沒(méi)有辦法直接通過(guò)ssh 主機(jī)名進(jìn)行免密登陸
3.NFS文件系統(tǒng)的權(quán)限設(shè)置,所有機(jī)器都必須對(duì)這區(qū)域有讀寫(xiě)權(quán)限,經(jīng)常出現(xiàn)的錯(cuò)誤如下
引自http://www.heminjie.com/system/linux/2998.html
NFS是非常通用和簡(jiǎn)單的Linux下共享協(xié)議,但是最近安裝了一次,在另一臺(tái)CentOS用mount掛載時(shí)卻出現(xiàn)“access denied by server while mounting”這個(gè)錯(cuò)誤;
?
因?yàn)橹芭渲眠^(guò)很多次NFS了,都沒(méi)出現(xiàn)過(guò)一點(diǎn)問(wèn)題,于是先試試在本機(jī)mount掛載,測(cè)試可以掛載,但是在另一臺(tái)機(jī)器上卻報(bào)錯(cuò),首先想到的是iptables防火墻問(wèn)題,于是關(guān)閉防火墻,也一樣報(bào)錯(cuò)。
?
去網(wǎng)上搜索了一下,遇到這個(gè)錯(cuò)誤的人也很多,但是原因都不大相同,在這里我就總結(jié)一下出現(xiàn)此錯(cuò)誤的幾種原因:
?
1、使用了非法端口,也就是使用了大于1024的端口。
這個(gè)錯(cuò)誤,可以通過(guò)查看日志確認(rèn):
[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 選項(xiàng),重啟nfs服務(wù),再?lài)L試掛載。
/home/nfsshare/ *(insecure,rw,async,no_root_squash)
?
2、NFS版本問(wèn)題
編輯/etc/sysconfig/nfs文件,找到下面:
最后保存,重啟nfs服務(wù),再?lài)L試掛載;如果掛載不上,可嘗試在后面加-o nolock參數(shù)。
?
3、查看客戶(hù)端掛載的目錄是否具備讀寫(xiě)權(quán)限,添加相應(yīng)權(quán)限即可。
?
4、nfs服務(wù)器上的/etc/hosts中設(shè)置了客戶(hù)端機(jī)器IP對(duì)應(yīng)域名,去掉即可。
?
通過(guò)以上這幾種方法,access denied by server while mounting這個(gè)錯(cuò)誤應(yīng)該可以得到解決了。
/就介紹這么多了,這是我再實(shí)際操作中遇到的問(wèn)題,希望能幫到大家!!!
?
總結(jié)
以上是生活随笔為你收集整理的多台工作站搭建MPI并行环境的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php 403 nginx,403ngi
- 下一篇: 对所写博客的几点说明