因爲所作研究工作計算量真是太大了,一臺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這個錯誤應該可以得到解決了。
/////就介紹這麼多了,這是我再實際操作中遇到的問題,希望能幫到大家!!!