【轉】MPI簡介

MPI簡介 

  MPI(Message Passing Interface)是消息傳遞並行程序設計的標準之一,當前通用的是MPI1.1規範。正在制定的MPI2.0規範除支持消息傳遞外,還支持MPI的I/O規範和進程管理規範。MPI正成爲並行程序設計事實上的工業標準。
  MPI的實現包括MPICH、LAM、IBM MPL等多個版本,最常用和穩定的是MPICH,曙光天潮系列的MPI以MPICH爲基礎進行了定製和優化。

  MPICH含三層結構,最上層是MPI的API,基本是點到點通信,和在點到點通信基礎上構造的集羣通信(Collective Communication);中間層是ADI層(Abstract Device Interface),其中device可以簡單地理解爲某一種底層通信庫,ADI就是對各種不同的底層通信庫的不同接口的統一標準;底層是具體的底層通信庫,例如工作站機羣上的p4通信庫、曙光1000上的NX庫、曙光3000上的BCL通信庫等。

  MPICH的1.0.12版本以下都採用第一代ADI接口的實現方法,利用底層device提供的通信原語和有關服務函數實現所有的ADI接口,可以直接實現,也可以依靠一定的模板間接實現。自1.0.13版本開始,MPICH採用第二代ADI接口。

  我們將MPICH移植到曙光3000高效通信庫BCL(Basic Communication Library)上(簡稱MPI_BCL)。MPI_BCL的接口標準與MPICH版本1.1完全一致,滿足MPI1.1標準。同時,也支持ch_p4的通信庫,即利用TCP/IP通信機制。從網絡硬件角度說,MPI_BCL針對系統網絡,MPI_ch_p4針對高速以太網。

1.MPI的程序設計

  MPI1.1標準基於靜態加載,即所有進程在加載完以後就全部確定,直至整個程序結束才終止,在程序運行期間沒有進程的創建和結束。一個MPI程序的所有進程形成一個缺省的組,這個組被MPI預先規定的Communicator MPI_COMM_WORLD所確定。

  MPI環境的初始化和結束流程如下:在調用MPI例程之前,各個進程都應該執行MPI_INIT,接着調用MPI_COMM_SIZE獲取缺省組(group)的大小,調用MPI_COMM_RANK獲取調用進程在缺省組中的邏輯編號(從0開始)。然後,進程可以根據需要,向其它節點發送消息或接收其它節點的消息,經常調用的函數是MPI_SEND和MPI_RECV。最後,當不需要調用任何MPI例程後,調用MPI_FINALIZE消除MPI環境,進程此時可以結束,也可以繼續執行與MPI無關的語句。

  上面提到的六個函數:MPI_INIT,MPI_COMM_SIZE,MPI_COMM_RANK,MPI_SEND,MPI_RECV,MPI_FINALIZE 實際上構成了編寫一個完整的MPI程序所需例程的最小集。

2.MPI的幾個重要特徵

  下面分別介紹MPI的幾個重要特徵:Communicator(通信空間)、Group(進程組)、Context_id(上下文標識)、Data Types(數據類型)。
MPI提供Communicator來指定通信操作的上下文,提供了通信操作的執行空間。在某個通信空間(或上下文)中發送的消息必須在相同的空間中接收,不同空間中的消息互不干擾。定義一個Communicator,也就指定了一組共享該空間的進程,這些進程組成了該Communicator的Group。

  Communicator通過其特徵屬性Context_id來區分,同一個進程不同的Communicator有不同的Context_id。因此Context_id是另一個區分消息的標誌。

  MPI引入消息的Data Type屬性的目的有兩個:一是支持異構系統計算;二是允許消息來自不連續的或類型不一致的存儲區,例如,可以傳送數組的一列,或傳送一個結構值,而該結構的每個元素的類型不同。Data Types定義了消息中不連續的數據項及其可能不同的數據類型。Data Type由應用程序在執行時通過基本的數據類型創建。

3.消息

  一個消息相當於一封信,消息內容相當於信本身,消息的接收者相當於信封上的內容。因此通常將前者稱爲消息的buffer, 後者稱爲消息的envelop。

  buffer: message address, count, datatype;
  envelop: process id, message tag,communicator

  在MPI以前的大多數通信系統中,消息buffer通常僅由buffer的地址和長度決定(例如曙光1000上的NX通信系統),那麼在MPI的消息格式中爲什麼要引入Data Type呢?這有兩個主要原因:

  支持異構計算:不同系統有不同的數據表示。解決這一問題的方法是預先定義一些基本數據類型,MPI實現過程中對這些類型進行轉換,例如轉換爲XDR格式,接收時進行反轉。

  派生的數據類型(Derived Data Types):允許消息來自於不連續的和類型不一致的存儲區域。

4.MPI應用程序的編譯

Include文件

  C語言應用程序應有
    #include “mpi.h”
  若使用cc編譯,命令行應有:
    -I/cluster/mpi/net/include (net版)
    -I/cluster/bcl/include -I/cluster/rms/include -I/cluster/sdr/include -I/cluster/mpi/mesh/include (mesh版)

  Fortran語言應用程序應有
   include ‘mpif.h’
  若使用f77編譯, 命令行應有:
    -I/cluster/mpi/net/include (net版)
    -I/cluster/bcl/include -I/cluster/rms/include -I/cluster/sdr/include -I/cluster/mpi/mesh/include (mesh版)

MPI庫文件

C語言
  C語言程序編譯時需作下述鏈接:
    -L/cluster/mpi/net/lib -lmpi -lbsd (net版)
    -L/cluster/mpi/mesh/lib -L/cluster/bcl/lib -L/cluster/rms/lib -L/cluster/sdr/lib -lmpi -lbcl -lrms -lsdr (mesh版)
  數學函數庫還應鏈接: -lm

Fortran語言
  Fortran編譯時應作下述鏈接:
    -L/cluster/mpi/net/lib -lmpi -lbsd (net版)
    -L/cluster/mpi/mesh/lib -L/cluster/bcl/lib -L/cluster/rms/lib -L/cluster/sdr/lib -lmpi -lbcl -lrms -lsdr (mesh版)

mpif77和mpicc

  MPI提供了兩個工具(mpif77和mpicc)來簡化MPI應用程序的編譯。用戶可以直接地使用命令行方式mpicc或mpif77來編譯C或Fortran程序,編譯方式與cc和f77完全一致。如:
    mpif77 -c foo.f
    mpicc -c foo.c
    mpif77 -o foo foo.o
    mpicc -o foo foo.o
  有時鏈接時需一些特殊庫, 應在鏈接時註明。使用mpicc和mpif77省略了有關MPI的路徑設置。

5.MPI應用程序的運行

  應用程序編譯好後,使用mpirun命令運行MPI應用程序。mpirun命令完整的格式如下:
    mpirun [-h|-?|-help] [-sz size|-sz hXw] [-np nprocs] [-pl poolname]

   :安裝 MPICH

原理:


什麼是 Cluster 與 Cluster 的優點

什麼是 Cluster 呢?目前常見的 Cluster (叢集)架構有兩種,一種是 Web / Internet cluster system,這種架構主要是將資料放置在不同的主機上面,亦即由多部主機同時負責一項服務;而另外一種則是所謂的平行運算了!平行運算其實就是將同一個運算的工作,交給整個 Cluster 裏面的所有 CPU 來進行同步運算的一個功能。由於使用到多個 CPU 的運算能力,所以可以加快運算的速度。目前比較常見於平行運算功能的,通常需要在超級計算機上面纔看的到,這些超級計算機主要是用在天文、軍事、物理等需要很精密的、大量的運算的工作中,而考慮到穩定性,則通常是用在 Unix 系統上面的硬件架構上。不過,目前由於 PC 上面的 CPU 的運算功能越來越強大了~因此,當然很多程序開發者就動腦筋到 PC 上面來製作並行計算機的系統囉!我們這篇短文主要在介紹的就是『平行運算』這一類的 Cluster 了!

由於 Cluster 主要是用在平行運算上面的,而所謂的平行運算是使用到多顆 CPU 的運算功能,因此可以讓您的大型運算的程序很快的執行完畢!因此,如果你的工作環境當中,常常會使用到很耗 CPU 運算功能的程序時,就可以嘗試使用 Cluster 來進行工作囉!應該可以節省您不少的時間吶!此外,我們這篇短文主要是在 X86 架構下的 PC 來架設 Cluster 的喔!

不過,也需要特別留意的是,由於我們的 Cluster 是將一個工作平均分給所有的 node (注:一顆 CPU 在一個 Cluster 架構下,就稱爲一個 node 囉!),所以,萬一您做成的 Cluster 系統當中,所有的 node 並非完全相同的運算等級,那麼先做完工作的 node 將會暫停工作,會等到所有的 node 都進行完畢後,纔會在進行下一動~所以啦!強烈的建議在同一個 cluster 的架構中,儘量所有的 CPU 都使用相同的 CPU 型號,應該會比較好一點喔!


Cluster 的主從架構

最簡單的 Cluster 其實就是以一種主從架構來進行資料的運算工作的,圖標如下:

上面的 Master 與 Slave 指的都是 CPU 喔!

Master 那部機器上面必須要有可以將工作分配給各個 node 去工作的函式庫,也就是 MPI ,他最重要的功能就是將工作給他分配下去的啦!而最重要的軟件就是:(1)MPICH;(2)編譯器(compiler, 例如 Fortran);

什麼是網絡功能呢?如果 master 與 slave 是在同一部機器當中,例如雙 CPU 的主機板,那麼這裏就不需要網絡功能啦!不過,如果我是使用四臺雙 CPU 的 PC 呢?呵呵!那麼這四部主機就需要以高速網絡架構進行聯機啦!此外,還需要在這四部主機之間建立可以互通訊息的通訊協議才行,這方面的功能就含有:(1)R Shell, 亦即稱爲 RSH;(2)NIS,使 Master 與 Slave 具有相同的帳號羣組關係;(3)NFS,使讀取寫入的資料可以在同一個 partition 上面;

Slave 就是單純的將來自 Master 的任務給他做完就是了!

整個主從架構大致上就是這樣啦!因此,可以知道的是,我們需要的就是上面那些咚咚囉!


達成 Cluster 所需要額外功能 ( RSH ) 與軟件 ( MPICH )

由上面的 Cluster 主從架構當中,我們知道 Master 與 Slave 之間的網絡溝通很重要的一個咚咚,那就是 R Shell 囉!此外,還有將一個工作傳送給不同的 node 來進行計算的任務,就需要 MPICH 這個函式庫來進行!簡單的談一談這兩個玩意兒吧!

RSH:
在我們的 Linux 主機上面工作,通常使用 BASH 這個 shell 來傳達給 kernel 工作的訊息,以使主機正確的工作;而如果在不同的主機之間,那就可以使用 R Shell 來進行指令的下達喔,如此一來,我們就可以直接在 A 機器,向 B 機器下達工作的指令,而不需要登入 B 機器呢~那就是 RSH 的主要功能啦!最常見的 RSH 指令就是 rcp 與 rsh 了!有興趣的朋友應該知道以 man 來查尋一下該指令的用法囉!
需要附帶一提的是,這個 RSH 是『相當危險』的一個服務喔!由於我們可以直接登入 RSH 主機,並且在上面進行指令的下達,爲了避免還要輸入密碼的問題,因此通常 RSH 已經將信任主機設定好了,不過,由於 RSH 會激活一些 port 來監聽 Clients 的需求,而偏偏這些 port 與 daemon 都還挺危險的,因此,『Cluster 最好是設定在內部網域當中,並使用私有 IP ,比較能夠避免危險』喔!此外,那個 Master 也必須要設定好一定程度的嚴密防火牆喔!

MPICH:
MPI 是 Messages Passing Interface 的縮寫,他本身是一個規格很嚴密的通訊標準,主要的功能是在處理平行運算之間各個 node 的資料交換,請注意, MPI 並不是一套軟件喔!而至於 MPICH 就是符合 MPI 這個標準通訊協議的一套軟件了!因此,我們可以經由 MPICH 這個軟件提供的 MPI 函式庫來達成平行運算的功能喔!也就是說,我們所寫的程序,只要能夠使用 MPICH 提供的函式庫,那麼該程序就可以進行平行運算時候所需要的功能了,這就可以避免程序開發者還要去處理通訊節點上面的問題,而可以將程序開發的重心着重在程序本身的問題上面!
MPICH 是由 Mathematics and Computer Science Division的 Argonne 實驗室所發展,詳細的資料可以參考:http://www-unix.mcs.anl.gov/mpi/mpich/

除了這兩個軟件之外,還需要 NIS 與 NFS 喔!所以啦!要建置一個 Cluster 的話,身爲系統管理員的您,必須要學會的技能真是相當的多的,至少需要:

熟悉 Linux 的操作技巧;
熟悉 Linux 基礎網絡參數設定;
熟悉 Linux 相關的 Server 架設(這方面請參考鳥哥的私房菜架站篇);
瞭解 RSH 的相關功能與設定技巧;
瞭解 MPICH 的設定與相關功能;
熟悉至少一種程序語言。

還真的是不好學啊!鳥哥也是新手玩弄 Cluster 說~大家一起研究研究吧!


架設流程

要架設 Cluster 當然就是需要多部的 PC 來聯機啦!不然怎麼稱爲 Cluster 呢?您說是吧!所以,無論如何,在架設 Cluster 之前,請務必要確認您的『所有硬件以及網絡功能都是完整無缺的!』否則就無法繼續下去啦!另外,建議 Cluster 的所有主機規格儘量相同,可以避免等待的困擾呢!底下就來談一談整個架設流程吧!


整體架構

整體架構的架設當中,需要的所有軟件爲:

Master 主機安裝需要:
防火牆的設定(含 NAT 架設);
RSH
NIS Server
NFS Server
Compiler Install
MPICH Install
其它特殊功能

Slave 主機安裝需要:
防火牆的設定
RSH
NIS Client
NFS Client

基本上,幾乎所有的工作都是在 Master 上面做啦! Slave 最大的任務就是進行來自 Master 所要求的計算工作,因此,Slave 能夠越簡單越好~至於 Master 上面,由於我們都是在 Master 主機上面下達工作指令,而總不能老是在屏幕前面下達指令吧!因此上,Master 通常會有兩個網絡接口,分別是對外的 Public IP 與對內的 Priavte IP。而既然 Master 有提供 Public IP 的設定,自然就比較擔心所謂的駭客入侵問題,所以啦,您的 Master 主機,要嗎就不要開放 Public IP ,要嗎就務必要設定很嚴密的防火牆,並且不必要的服務就儘量關閉他~畢竟我們的 Cluster 是要用來做爲計算運作的,所以不必要的網絡協議服務,當然就是關閉他啦!底下鳥哥將以自己的一個實際案例進行說明的啦!參考看看吧!


一個實例規範

在我這個案例當中, Cluster 主要的功能爲:進行 MM5 這個氣象模式的運算以及 Models-3/CMAQ 這個空氣品質模式的運算,而由於這兩個咚咚都是使用 PGI Fortran 90 做爲 Compiler ,因此,我就必須要進行 PGI 的安裝啦!而我的硬件架構主要是這樣的:

Master : 爲雙 CPU 主機,使用 AMD MP 的 CPU ,並且有一顆 120 GB 的硬盤,此外,由於我的數值模式需要 PGI Fortran ,所以就必須要安裝 Server 版的 PGI Fortran 喔!
Slave : 共有三部 Slave ,每一部均爲雙 CPU 的 AMD MP 的 CPU ,並且有一顆 120 GB 的硬盤;
連接 Master 與 Slave 的爲 10/100/1000 的 Switch ,當然,四部主機(1 x master + 3 x slave)都是安裝 Intel 的 1GB 網絡卡喔!

硬件連接有點像這樣:

那麼底下就來談一談怎麼安裝他吧!


系統安裝( Red Hat 9 )

我的這個系統使用的是最新的 Red Hat 出版的 Red Hat 9 ,會用這個玩意兒最大的原因是因爲 Red Hat 是目前支持的 Linux 軟件最多的一個 Linux Distribution 了,安裝他之後,就比較不會欠東欠西的,此外,很多的軟件都是以 Red Hat 做爲測試的平臺,因此我就選擇他來做爲我的系統平臺啊!另外,需要留意的是,由於 Slave 並不需要使用到圖形接口的功能,他單純是用在計算上面,因此我沒有在 slave 上面安裝圖形接口的打算~至於 Master 則安裝了 KDE 這個咚咚喔!好了,Linux 的安裝相信大家應該都要很熟悉了,所以我就不再談安裝的詳細步驟,僅提幾個特別需要注意的地方囉:

Partition 方面:
因爲我的硬盤實在是在蠻大的,並且在 Slave 上面也是 120 GB 的硬盤,如果不將 Slave 的硬盤使用的話,實在覺得很浪費,因此,一開始我就規劃將四部主機的硬盤全部都以 NFS 分享到內部網域當中,而爲了避免跟系統的檔案放在一起,因此,我就將硬盤分割出除了必要的 partition 之外,其它的就掛載在 /disk1 這個目錄當中,四部主機的 parition 都相同,分別是:

/ : 10 GB
/var : 5 GB
/tmp : 3 GB
Swap : 3 GB ( 因爲我每部 Linux 主機上面都有 1.5 GB 的內存 )
/disk1: 96 GB

安裝時選擇的套件:
所有的主機都需要底下的套件安裝(注:因爲原本的筆記記錄的很亂,所以如果找不到相同的字眼,那就是我寫錯啦!):
Administrator Tools
Development Tools
Editor
Enginerring
Kernel Development
Network Servers
Server configure
Sound and vedio tools
System Tools
Text-based
Windows servers
不過, Master 需要額外再增加 X Window 方面的支持,例如 KDE 與 X-Window System 這兩個主要的套件要勾選喔!

系統安裝大致上就是這些吧,如果有疏漏的,請未來在安裝完畢之後,再以原本 Red Hat 9 的光盤來重新安裝他吧!反正 Red Hat 系統都是以 rpm 來安裝的,挺容易安裝的喔!整個安裝完畢後,還花不到幾分鐘呢!

防火牆 ( 含 NAT 主機 ) 與網絡設定

由於我們的 Cluster 主要是用在數值運算,因此,當然不需要對外開放網絡服務啦!所以,最好就是以私有 IP 來進行網絡的設定是比較好的!此外,最好還是要設定好防火牆的啦!我的網域參數預設是這樣的:

Network/netmask:192.168.10.0/255.255.255.0
Master:(對外)140.116.xxx.yyy;(對內)192.168.10.30, Gateway 爲對外的 Gateway 喔!並且有設定 NAT 啊!
Slave:192.168.10.10, 192.168.10.20, 192.168.10.40 三部,Gateway 爲 192.168.10.30

網絡參數的各個檔案是這樣的:

各個主機的主機名稱請修改:/etc/sysconfig/network
各個主機的網絡卡設定項目請修改:/etc/sysconfig/network-scripts/ifcfg-eth0
各個主機的 DNS 查尋系統請修改:/etc/resolv.conf
各個主機的內部主機名稱查尋系統請修改:/etc/hosts,我的 /etc/hosts 如下:
127.0.0.1 localhost localhost.localdomain
192.168.10.10 node1.cluster
192.168.10.20 node2.cluster
192.168.10.30 server.cluster
192.168.10.40 node4.cluster

而我的每部主機先將所有的網絡服務都給他關掉去,僅剩下 SSH 這個網絡協議存在而已~所以,我利用 Red Hat 提供的 ntsysv 這個指令來選擇開機時激活的項目有:

atd
crond
iptables
keytable
network
random
sshd
syslogd
xinetd

至於防火牆系統的規劃上面,由於 Master 主機 (192.168.10.30) 具有 NAT 的功能,所以必須要修改一下他的防火牆機制,因此,就有兩個不同的防火牆機制 scripts 囉!另外,由於擔心外來的入侵攻擊,因此,在這個 Cluster 的系統當中,我的 iptables 防火牆機制是使用『MAC(網絡卡卡號)』來做爲設定的基準,而不是使用 IP 啊!爲什麼呢?因爲反正我僅允許我自己同網域內的幾部計算機連進來而已,當然沒有必要針對 IP 啊!所以囉,就必須要收集四部主機的網絡卡來允許他進入囉。此外,由於我可能並不在 Cluster 前面操作,因此會啓用一兩部主機的網絡卡卡號,好讓他能夠進入 Cluster 呦!底下就將我的防火牆機制給他列出來一下:

Master:

!/bin/bash

This program is for iptables’ rules

VBird 2003/05/02

0. PATH and modules

PATH=/sbin:/bin:/usr/sbin:/usr/bin
export PATH
modprobe ip_tables
modprobe iptable_nat
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

1. clear the rules and make the policys

iptables -F
iptables -X
iptables -Z
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

2. NAT services

echo “1” >; /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE

3. Trust network and conditions

iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m mac –mac-source XX:YY:ZZ:WWQ -j ACCEPT

上面這一行就是網絡卡的卡號啦!

Slave:
Slave 的防火牆機制跟 Master 幾乎一模一樣,只是因爲在內部啊,所以不需要激活 NAT 的服務即可!上面的給改一改先~

好啦!網絡的設定與防火牆就到這裏爲止,要記得喔,你的網絡必須要已經能夠正確的激活了!如果還是無法激活網絡,或者是防火牆機制還是有問題,那麼對外的那個網絡卡的網絡線還是先給他拔掉吧!比較安全一些些的啦!等到都設定妥當,尤其是防火牆,然後纔來激活他吧!


NFS 架設規劃

由於我這裏預計要設定 NIS ,並且每部主機的 /disk1 都要分享出去,因此,每部主機都必須要開放 NFS 的服務喔!並且,每一部主機的設定都可以相同吶!這樣比較容易來設定囉~此外,比較不一樣的地方在於 Master 這一部,由於我的 Cluster 所有的帳號都在 NIS 的管制之中,因此,我將 Master 的 /home 也分享出來,並且每部 Slave 主機都掛載 Master 的 /home 才成!

這個 NFS 在 Cluster 當中是相當重要的,爲什麼呢?因爲我們不是在四部主機上面工作嗎,而這四部主機會去讀取的『資料』其實都是『在本機上面可以看的到的』資料才行,這還包括底下我們會持續介紹的 mpich 這個軟件的函式庫呢!也就是說:『在 Cluster 裏面,所有的機器會使用到的資料必須都在相同的目錄當中!』所以,這就是爲什麼我們要對 /home 進行分享,以及進行 NIS 的設定了!此外,因爲我的 Server 這部 Master 機器分享出去的目錄中,已經含有 /disk1 這個 partition,此外,還通通將他掛載在 /cluster/server 底下,因此,可以建議:『未來在安裝所有的 Cluster 需要的套件資料時,例如 Compiler 以及 MPICH 等等,都可以安裝到 /cluster/server 這個目錄底下,以使所有的主機都能夠使用同一個 partition 來源的資料喔!』

設定程序:

Master:

  1. 激活 portmap 並且設定開機激活:
    [root @server root]# /etc/rc.d/init.d/portmap
    [root @server root]# chkconfig –level 35 portmap on

  2. 設定 NFS 分享出去:
    [root @server root]# vi /etc/exports
    /home 192.168.10.0/24(rw,async,no_root_squash)
    /disk1 192.168.10.0/24(rw,async,no_root_squash)
    [root @server root]# exportfs -rv
    [root @server root]# /etc/rc.d/init.d/nfs start
    [root @server root]# chkconfig –level 35 nfs on

  3. 設定預計的掛載點:
    [root @server root]# mkdir -p /cluster/node1
    [root @server root]# mkdir -p /cluster/node2
    [root @server root]# mkdir -p /cluster/node4
    [root @server root]# mkdir -p /cluster/server

Slave:

  1. 激活 portmap 並且設定開機激活:
    [root @node1 root]# /etc/rc.d/init.d/portmap
    [root @node1 root]# chkconfig –level 35 portmap on

  2. 設定 NFS 分享出去:
    [root @node1 root]# vi /etc/exports
    /disk1 192.168.10.0/24(rw,async,no_root_squash)
    [root @node1 root]# exportfs -rv
    [root @node1 root]# /etc/rc.d/init.d/nfs start
    [root @node1 root]# chkconfig –level 35 nfs on

  3. 設定預計的掛載點:
    [root @node1 root]# mkdir -p /cluster/node1
    [root @node1 root]# mkdir -p /cluster/node2
    [root @node1 root]# mkdir -p /cluster/node4
    [root @node1 root]# mkdir -p /cluster/server

掛載程序:

Master:
將底下這些指令測試執行一下,如果成功後,將指令寫入 /etc/rc.d/rc.local 當中

[root @node1 root]# mount -t nfs -o bg,intr server.cluster:/disk1 /cluster/server
[root @node1 root]# mount -t nfs -o bg,intr node1.cluster:/disk1 /cluster/node1
[root @node1 root]# mount -t nfs -o bg,intr node2.cluster:/disk1 /cluster/node2
[root @node1 root]# mount -t nfs -o bg,intr node4.cluster:/disk1 /cluster/node4

Slave:
將底下這些指令測試執行一下,如果成功後,將指令寫入 /etc/rc.d/rc.local 當中

[root @server root]# mount -t nfs server.cluster:/home /home
[root @server root]# mount -t nfs -o bg,intr server.cluster:/disk1 /cluster/server
[root @server root]# mount -t nfs -o bg,intr node1.cluster:/disk1 /cluster/node1
[root @server root]# mount -t nfs -o bg,intr node2.cluster:/disk1 /cluster/node2
[root @server root]# mount -t nfs -o bg,intr node4.cluster:/disk1 /cluster/node4

呵呵!這樣就設定成功了!我們每一部主機『看起來』就好象有 400 GB 的硬盤空間啊!可怕了吧!


NIS 架設規劃

NIS 的設定也是很簡單,不過主要還是需要分爲 NIS Server 與 NIS Client 兩部份來設定的!請注意,在設定之前,就已經要將 NFS 搞定喔!這些流程都是有一定程度的相關性的呢!

Master:
在 Master 上面需要進行的工作很多喔!首先,一定要修改 ypserv.conf 以及其它相關的檔案的吶!

  1. 激活 time 與 time-udp 這兩個預先要激活的 daemon
    [root @server root]# chkconfig –level 35 time on
    [root @server root]# chkconfig –level 35 time-upd on
    [root @server root]# /etc/rc.d/init.d/xinetd restart

  2. 建立 NIS 的領域名稱 (我這裏是設定爲 cluster ):
    [root @server root]# nisdomainname cluster
    [root @server root]# echo “/bin/nisdomainname cluster” >;>; /etc/rc.d/rc.local
    [root @server root]# echo “NISDOMAIN=cluster” >;>; vi /etc/sysconfig/network

  3. 建立 NIS 設定檔:
    [root @server root]# vi /etc/ypserv.conf (在這個檔案內增加三行即可)
    127.0.0.0/255.255.255.0 : * : * : none
    192.168.10.0/255.255.255.0: * : * : none

    • : * : * : deny
      [root @server root]# touch /etc/netgroup
  4. 激活 NIS:
    [root @server root]# /etc/rc.d/init.d/ypserv start
    [root @server root]# /etc/rc.d/init.d/yppasswdd start
    [root @server root]# chkconfig –level 35 ypserv on
    [root @server root]# chkconfig –level 35 yppasswdd on

  5. 製作數據庫:(每次有更動使用者信息時,就必須要進行這個步驟!)
    [root @server root]# /usr/lib/yp/ypinit -m
    [root @server root]# chkconfig –level 35 ypserv on
    [root @server root]# chkconfig –level 35 yppasswdd on

Slave:
至於 NIS Client 則是需要設定 yp.conf 這個檔案呢!

  1. 建立 NIS 的領域名稱 (我這裏是設定爲 cluster ):
    [root @node1 root]# nisdomainname cluster
    [root @node1 root]# echo “/bin/nisdomainname cluster” >;>; /etc/rc.d/rc.local
    [root @node1 root]# echo “NISDOMAIN=cluster” >;>; vi /etc/sysconfig/network

  2. 建立 NIS 查尋的主機名稱:
    [root @node1 root]# vi /etc/yp.conf
    domain cluster
    ypserver server.cluster

  3. 修改密碼驗證方式:
    [root @node1 root]# vi /etc/passwd (在這個檔案的最底下新增如下一行)
    +::::::
    [root @node1 root]# vi /etc/nsswitch.conf
    passwd: files nis nisplus
    shadow: files nis nisplus
    group: files nis nisplus
    hosts: files nis dns

  4. 激活 NIS:
    [root @server root]# /etc/rc.d/init.d/ypbind start
    [root @server root]# chkconfig –level 35 ypbind on

呵呵!不囉唆!馬上就設定妥當啦!


RSH 設定

這個 RSH 已經提過了,主要的功能是提供 Master 可以使用 R 指令(如 rsh, rlogin, rcp 等等)來進行 slave 端主機的操控的!所以啦, RSH daemon 主要是在 slave 機器上面架設的喔!與 Master 就無關啦!Master 只要能夠執行 R command 即可!雖然是如此,不過,在我的測試當中,最好 Master 也激活 RSH 比較好一些些囉!在底下的設定當中,我們假設 Server 上面的所有使用者都可以使用 R command 呢!設定的方法很簡單啊!

Slave & Master:
底下的設定在 Master 與 Slave 上面都需要動作喔!設定一樣即可!
1. 激活 RSH 囉!
[root @node1 root]# chkconfig –level 35 rsh on
[root @node1 root]# /etc/rc.d/init.d/xinetd restart

  1. 編輯可使用 R command 的主機設定文件:
    [root @node1 root]# vi /etc/hosts.equiv
    server.cluster +

特別注意,由於 RSH 預設就是不支持 root 使用 R command ,所以您必須要到 master 上面去,並以一般身份使用者進行 R command 的測試才行喔!不要直接以 root 工作,會無法成功的啦!(顯示 permission deny 的啦!)

Master:
由於 RSH Server 上面的設定中,您的 User 家目錄必須要存在一個名爲 .rhosts 的檔案,原本我的 Server 上面就有一個名爲 test 的使用者,而並且爲了讓我未來新建立的使用者都能夠使用 R command ,所以我在 Master 這部機器上面做了這樣的動作喔:
[root @server root]# vi /home/test/.rhosts
server.cluster
[root @server root]# vi /etc/skel/.rhosts
server.cluster
[root @server root]# chmod 644 /etc/skel/.rhosts

這樣就妥當的設定好了 RSH 囉!


安裝 Fortran 90 的編譯程序 PGI pgf90 ( PS. server version )

我由 PGI 的官方網站下載了最新的 PGI Server 套件,請特別留意的是,由於 PGI 有兩種模式,一種是工作站(Workstation)一種則是服務器(Server)模式,其中,工作站僅能提供單一主機來操作,無法進行 Cluster 的功能的!因此,請務必要下載 Server 的版本,並且是支持 Linux 版本的喔!不要搞混了! PGI Fortran Server version 的下載網址在這個地方:http://www.pgroup.com/downloads.htm,請自行下載吧!比較需要留意的是,從上面這個網站下載的版本僅是分享軟件的版本,您安裝之後可以具有 15 天的免費使用期限,超過期限之後,又需要重新安裝一次,很是麻煩的啦!如果您的 Cluster 是用來進行學術研究的,那麼在測試完成之後,可能需要去他的網站註冊,這個註冊的費用差異可就很大了~因爲未來我的 Cluster 需要一直不斷的運作,因此是需要去註冊的啦!並且,我只會用到 Fortran 這個編譯器,因此,我就直接使用 PGIHPF 這個版本來測試安裝而已,而不是使用全部 ( 含 PGI Fortran 與 C ) 的版本喔!因爲註冊的價差差了兩~三萬臺幣啊!安裝 Fortran 真是很簡單的啦!假設您將 linux86-HPF.tar.gz 放置在 /root/software 底下,則:(注:以下的動作僅只要在 Master 上面進行即可喔!)

  1. 建立 pgi fortran 在 /cluster/server/program/pgi 底下:
    [root @server root]# cd /usr/local/src
    [root @server src]# mkdir pgi-fortran; cd pgi-fortran
    [root @server pgi-fortran]# tar -zxvf /root/software/linux86-HPF.tar.gz
    [root @server pgi-fortran]# ./install
    接下來會有一些問題,請依序回答您的問題喔!
    至於授權嘛!請建立吧!
    最重要的地方,是在第三個問題,他會問你要安裝的目錄,請選擇
    /cluster/server/program/pgi

  2. 修改個人參數:由於 RSH 不以 root 工作,所以我以使用者 test 來測試:
    [root @serer root]# vi /home/test/.bashrc

加入這幾行關於 PGI 的咚咚:

PGI=/cluster/server/program/pgi
export PGI
PATH=$PGI/linux86/binPATH

  1. 設定查尋路徑:
    [root @server root]# vi /etc/man.config

加入這一行:

MANPATH /cluster/server/program/pgi/man

這樣就好了嗎?!沒錯!確實是這樣就完成了!很是簡單吧! ^_^要注意的是:

記得 pgf90 必須要讓所有的 node 都能夠讀的到,所以一定要安裝在 Server 的分享出去的目錄當中,我這裏的例子就是安裝在 /cluster/server/program/gpi 這個目錄當中囉!
執行檔要能夠執行,當然是必須要讓目錄在 PATH 這個變量底下,而我的 pgf90 是在 /cluster/server/program/pgi/linux86/bin 底下,所以,您的 PATH 必須要含有這個目錄才行!

大概就是如此囉!


安裝 MPICH

前面我們提過了,安裝 MPICH 是平行運算裏面最重要的一項工作了!因爲我們就是靠他來幫我們達成運作的啊!那麼怎麼來安裝呢?又是簡單得不得了啊!首先,請先下載 mpich 吧!下載的網址在底下,我是以 mpich 1.2.5-1a 來測試的喔!

http://www-unix.mcs.anl.gov/mpi/mpich/download.html

假設您將 mpich 下載在 /root/software 裏面,並且預計要安裝到 /cluster/server/program/mpich 當中,而且僅安裝 Fortran 而已的話,可以這樣做:

  1. 建立 mpich 在 /cluster/server/program/mpich 底下:
    [root @server root]# cd /usr/local/src
    [root @server src]# tar -zxvf /root/software/mpich.tar.gz
    [root @server src]# cd mpich-1.2.5
    [root @server mpich-1.2.5]# ./configure –enable-debug \

    ; -fc=pgf77 -f90=pgf90 \
    ; –prefix=/cluster/server/program/mpich
    [root @server mpich-1.2.5]# make && make install

  2. 建立可以利用的主機狀態:
    [root @server mpich-1.2.5]# cd /cluster/server/program/mpich/share
    [root @server share]# vi machines.LINUX
    node1.cluster:2
    node2.cluster:2
    node4.cluster:2
    server.cluster:2

這個檔案當中,格式爲 <主機名稱>;:<主機的 CPU 個數>;

  1. 建立需要的變量:(又是以 test 爲準喔!)
    [root @server root]# vi /home/test/.bashrc

加入這一些資料:

PATH=PATH:/cluster/server/program/mpich/binexportPATHMPIHOME=/cluster/server/program/mpichMPIARCH= MPI_HOME/bin/tarch
export MPI_ARCH MPI_HOME
[root @server root]# vi /etc/man.config

加入這一行:

MANPATH /cluster/server/program/mpich/man

呵呵!這樣就已經完成了 MPICH 的安裝與設定了!就跟你說很簡單吧!但是呢,要測試可就得需要特別留意了,因爲 root 預設是不許使用 RSH 的,所以測試一定要使用一般身份的使用者,這裏我以 test 這個人做爲測試的使用者喔!所以,請以 test 的身份登入主機,並且,這個 test 必須要在所有的主機上面都可以被查詢的到才行(請參考 NIS 的設定喔!)。

[test @server test]cpr/cluster/server/program/mpich/examples/.[test@servertest] cd examples
[test @server examples]makepi3f90[test@serverexamples] mpirun -np 8 pi3f90

上面那個 -np 後面接的就是使用 CPU 的個數啦!因爲我有 8 個 node ,

所以當然就以最大的 CPU 個數來測試看看,如果要看到底 CPU 有沒有激活的話,

可以先登入各個 slave 的主機,然後執行『 top -d 1 』來觀察 CPU 的使用率,

再執行上面這個程序,就能夠知道 CPU 有沒有運作了!

呵呵!沒想到 PGI 的試用版本就能夠提供多顆 CPU 的 Cluster 運作,真是給他很高興!這樣既然可以測試成功了,自然就可以去向 PGI 的官方網站註冊了!註冊費用不低,但是挺值得的啊!


重點回顧

Cluster 可以是並行計算的一種,主要除了雙 CPU 系統外,也可以用在多主機架構下的一種增快數值計算的方式;
並行計算的 Cluster 主要是藉由主從的架構去運行的,其主要的設定都在 Master 上面設定的, Slave 主要是計算功能而已,
Cluster 上面相當重要的地方在於 NFS 的設定,因爲 Master/Slaves 都需要讀取同樣的資料,所以 NFS 分享的檔案資料就極其重要了;
除了 NFS 之外,還需要 MPI 這個並行計算的函式庫之安裝,有了 MPI ,Cluster 才能真的運作起來;
在 Cluster 當中,所有的主機之指令的溝通主要亦經過 RSH 的運作;


參考資源

Marty’s Linux Cluster 架設日誌:http://web.csie.chu.edu.tw/~cs87668/cluster.htm
張裕麟先生的小文章:http://www.se.ntou.edu.tw/~ylchang/MyDocuments/MPICH-ins.txt
國家高速計算機中心:http://binfo.ym.edu.tw/edu/seminars/200201.files/frame.htm
MPICH官方網站:http://www-unix.mcs

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