VMware(虛拟機)下得Linux 叢集 (轉)
目錄提綱
背景簡介
叢集定義
高性能叢集的常見用途
叢集的條件
構造一個簡單的Linux叢集實作
并行計算設計
實驗遇到問題
實驗心得
背景簡介
随着摩而定律的慢慢失效,單CPU的內建電路 技術 和 工藝慢慢走到了技術的極限。然後,人們為了追求資訊系統的高性能和高可靠性,叢集技術随之産生和發展。(計算的速度變得更快?提高時鐘頻率,提高一個時鐘 周期執行的指令條數,更快的存儲器,不同級别的并行)一般而言,現在叢集技術是針對應用層系統的,而且往往具有下列幾方面的特性:
1) 高可用性2) 高可靠性3) 高伸縮性4) 高性能
由于開放源碼軟體概念的采用,以及叢集技術的精煉,使得高性能計算(HPC)正在變得越來越簡單。加上Linux的優越性能和其他相關免費的 資源 ,使得基于Linux 叢集在很多領域變得非常流行。
實驗主要完成Linux 叢集技術的高性能計算(HPC)及相關測試,從基本的概念,并行,叢集,到展示如何建構叢集并編寫并行程式。建構叢集以及對叢集進行基準測試,一步步入 手,是對一個完全陌生的知識的摸索過程。叢集環境的建構通過MPI來做,在實驗中也結合了主要是網絡和其他的相關的資料。
在Linux 上 FORTRAN、C 和 C++ 使用的高品質的 MPI 實作可以免費獲得,在這裡我們使用建構一個基于 MPICH 的 Linux 叢集。
叢集定義
叢集(一組協同工作的計算機)是充分利用計算資源的一個重要概念,
因為它能夠将工作負載從一個超載的系統(或節點)遷移到叢集中的另一個系統上。其處理能力是與專用計算機(小型機,大型機)可相比,但其成本效益高于專用計算機.
叢集的分類
故障遷移叢集、負載均衡叢集 、高性能叢集
1)故障遷移叢集
最簡單的故障遷移叢集有兩個節點:一個節點是活動的,另外一個節點是備用的,不過它會一直對活動節點進行監視。一旦活動節點出現故障,備用節點就會接管它的工作,這樣就能使得關鍵的系統能夠持續工作。
2)負載均衡叢集
負載均衡叢集通常會在非常繁忙的 Web 站點上采用,它們有多個節點來承擔相同站點的工作,每個擷取 Web 頁面的新請求都被動态路由到一個負載較低的節點上。
3) 高性能叢集
高性能叢集用來運作那些對時間敏感的并行程式,它們對于科學社群來說具有特殊的意義。高性能叢集通常會運作一些模拟程式和其他對 CPU 非常敏感的程式,這些程式在普通的硬體上運作需要花費大量的時間。
高性能叢集的常見用途
幾乎所有的産業界都需要快速的處理能力。随着越來越便宜而且快速的計算機的出現,更多公司表現出了對利用這些技術優勢的興趣。人們對于計算處理能力的需求是沒有上限的;盡管處理能力在迅速提高,但是人們的需求仍然超出計算能力所能提供的範圍。
1)生命科學研究
蛋白質分子是非常複雜的鍊,實際上可以表示為無數個 3D 圖形。對于蛋白質折疊的研究非常重要。
2)石油和天然氣勘探
震動圖中包含有大陸和洋底内部特性的詳細資訊,對這些資料進行分析可以幫助我們探測石油和其他資源。這種分析顯然需要大量的計算能力。這個領域對于計算能力的需求是如此旺盛,以至于超級計算機大部分都是在處理這種工作。
3)圖像呈現
在工程領域(例如航天引擎設計)操縱高分辨率的互動式圖像在性能和可伸縮性方面曆來都是一種挑戰将渲染螢幕的任務分割到叢集中的各個節點上,在每個節點上 都利用自己的圖形硬體來呈現自己這部分螢幕的圖像,并将這些像素資訊傳送到一個主節點上,主節點對這些資訊進行組合,最終形成一個完整的圖像。
GNU/Linux 作業系統(Linux)已經在叢集中得到了大量的采用。Linux 可以在很多硬體上運作,并且具有高品質的編譯器和其他軟體,例如并行檔案系統和 MPI 實作在 Linux 上都是免費的。采用 Linux,使用者還可以針對自己的任務負載對核心進行定制。Linux 是建構 HPC 叢集的一個非常好的平台。
叢集的條件
有工作站和網際網路兩個部分組成。
至少有兩個系統,這裡用了windows下的虛拟機安裝兩個Linux來作為主從節點來實作。
工作站中間能實作通信,利用高速的區域網路來構成一個并行的計算平台
構造一個簡單的Linux叢集實作
步驟 1
Linux環境的配置
對于我們的叢集,要使用 MPICH 和一組普通的 Linux 工作站。我們學習更是了解突出其中的基本原理,我們将建構最小的裸系統,在叢集環境中可以使用它來運作并行程式。同時實驗是在基于windwos下的兩個 VMware 映像來做的,可能算步上正真的叢集。 VMware,因為 CPU 需要進行共享。在性能上不會有優勢。首先安裝windwos下的Linux虛拟機。
(*注意)同時安裝時候注意相關的服務的開啟,防火牆的設定,在vm下安裝完Linux系統,配置好相關的參數環境。設定網絡,至少能夠使用機器名互相 ping 通。這些在下面要設定,最好系統安裝前後完成。
步驟 2
安裝 GNU C 編譯器和 GNU FORTRAN 編譯器。
當然這步應該最好在Linux初始安裝時候完成,沒有初始安裝的,通過服務設定,也可以x-window 可視話或者指令來設定啟用相關的服務。
步驟 3a
主機名:host1 host2
● 修改/etc/hosts檔案,将所有節點名稱及其ip位址填入。例如:
192.168.0.31 host1 #(主節點) ‘#’做注釋
192.168.0.41 host2
每個節點都進行類似的配置。這樣做的目的是使節點之間能夠通過host1 和host1 2的名稱互相通路。你可以通過ping noden 或 ssh noden進行測試。(noden為主機名)
● 修改(或建立)/etc/hosts.equiv檔案
将所有你允許通路本機進行mpi計算的機器名填入,一行一個機器名。這一步是為了使節點對其它的節點放權。
例如,我的機器host1 的/etc/hosts.equiv檔案是這樣的:
host1 #給自己放權,這樣在隻有一台機器時也可以模拟并行計算環境
host2
在host2的/etc/hosts.equiv檔案:
host1 #對host1 放權
host2
● 使用nfs共享檔案
首先決定一個用于啟動叢集計算的使用者名,不提倡使用root進行叢集計算。這裡在每個節
點上建立新使用者 linux ,他們的主目錄都是/home/linux,假設用host1做為計算的服務節點,在host1上建立~/mirror,修改檔案/etc/exports,(~/為home使用者目錄檔案)在其中增加一行:
/home/linux/mirror host1(rw) host2(rw)
使得機器host1和host2的使用者可以使用/home/linux/mirror。
在其他節點host2也建立/home/linux /mirror,在/etc/fstab檔案中增加一行:
host1:/home/linux/mirror /home/linux /mirror nfs rw,bg,soft 0 0
這樣節點host2即可使用mirror與host1共享檔案。
● 修改~/.bash_profile檔案 (在安裝mpi後更改)
建議把将來計算程式放在相同的路徑上,當然也可以不放在同一個目錄下面,但是用起來比較麻煩,需要一一指定每個節點程式的路徑。譬如你的程式為:fpi.f和a.out,把a.out放在~/linux/mirror/下即可。
修改~/.bash_profile檔案,主要是加入下列幾行腳本:
export PATH=$PATH:/usr/local/mpi/bin
export MPI_USEP4SSPORT=yes
export MPI_P4SSPORT=22
export P4_RSHCOMMAND=ssh
這裡我們預定了将來mpich的運作環境安裝在目錄/usr/local/mpi下面。其餘的三個變量是用來通知mpi運作環境采用ssh來作為遠端shell。
linux的運作環境到此就配置完畢了。
●配置ssh
安裝以後,應該保證各節點之間能夠用ssh互相登入。每個節點的sshd都應該能正常提供服務。
以設定的用于啟動mpi計算的使用者登入,運作ssh-keygen –t dsa(SSH2)或是ssh-keygen(SSH1)
–t rsa 1,這将生成一個私有/公開密鑰對,分别存放在~/.ssh/id_dsa和~/.ssh/id_dsa.pub或是
~/.ssh/identity和~/.ssh/identity.pub檔案中。然後進行通路授權,運作:
cp ~/.ssh/identity.pub ~/.ssh/authorized_keys 或是cp ~/.ssh/id-dsa.pub ~/.ssh/authorized_keys2
chmod go-rwx ~/.ssh/authorized_keys或是chmod go-rwx ~/.ssh/authorized_keys2
ssh-agent $SHELL
ssh-add
在每個節點幹一遍。
将所有節點的密鑰authorized_keys或是authorized_keys2 收集 起來,放到一個密鑰檔案中,
然後分發到各個節點。這樣做的目的是使各節點互相之間通路無需輸入密碼。在每個節點登
錄其它節點,ssh shallow,則在~/.ssh/下生成一個known_hosts檔案,裡面記錄登入使用者密鑰。
為所有節點配置 SSH,允許不詢問密碼就可以執行指令。這樣做的目的是能夠不需詢問密碼就可以執行 ssh -n host whoami 這樣的指令。SSH 用作不同機器之間的通信方法。(也可以使用 rsh 來實作這種功能。)
無法用ssh登入,則可以用ipchains -L指令檢視ipchains rules,進行正确的配置,使得ssh服務正常工作。若你對系統安全不是太在乎,則可以使用ipchains -F指令将所有的規則清空。
為了確定所有的配置都能正常工作,請執行下面的指令:ssh -n hostname 'date',并檢視這個指令能否成功執行,而不會出現任何錯誤。應該對所有節點都執行這種測試,這樣就可以確定所有節點上的設定都沒有問題。
注意:可能還需要修改防火牆的配置,使其允許節點彼此之間互相進行通信。
步驟 4a
接下來,我們将安裝 MPICH。
步驟 4b
下載下傳最新的mpich: http://www-unix.mcs.anl.gov/mpi/mpich/ MPICH,或者
ftp://ftp.mcs.anl.gov/pub/mpi/mpich.tar.gz 。拷貝到一個臨時目錄下,
我是從中科院 http://www.sccas.cn/gb/learn/learn1/200604110001.html 下在來的 MPICH 1.2.7p1 版本,安裝說明綜合網上資料,見上面。
我放在/home/mpi/mirror下了。/root下都可以,主要看解壓到的地方,這裡我們-prefix=/usr/local/mpi檔案中
首先,用tar xzpvf mpich-1.x.x.tar.gz解壓。生成mpich-1.x.x.目錄。
cd mpich-1.x.x
./configure -prefix=/usr/local/mpi -rsh=ssh —— 這告訴 MPICH 使用 ssh 作為通信機制
上面的一次編譯不成功用下面的指令,下面的指令通過測試
// ./configure -prefix=/usr/local/mpi --disable-weak-symbols
切換到mpich-1.x.x.目錄。
運作預處理:./configure -c++=pgCC -cc=pgcc -fc=pgf77 -f90=pgf90 /
-cflags="-Msignextend -tp athlon -DUSE_U_INT_FOR_XDR -DHAVE_RPC_RPC_H=1" /
-fflags="-tp athlon" -c++flags="-tp athlon" -f90flags="-tp athlon"/
-prefix=/usr/local/mpich -opt=-fast -rsh=ssh
我采用了Portland Group的編譯器,是以需要在預處理時指定使用的編譯器和常用的選項,
-tp athlon為AMD athlon産生代碼。mpich的安裝位置為/usr/local/mpich,運作環境的遠端host2
為ssh。
-DUSE_U_INT_FOR_XDR -DHAVE_RPC_RPC_H=1在有的系統上不需要
有時候需要設定環境變量:
setenv LIBS "-L/usr/local/pgi/linux86/lib -lpgftnrtl -lpgc"
編譯:make
安裝:make install
分别将”/usr/local/mpi/bin” 和 “/usr/local/mpi/man” 加入到環境變量PATH和MANPATH中。
隻需在目錄/etc/profile.d中建立兩個檔案mpich.sh和mpich.csh,它們分别對Bourne shell和C shell 起作業,這兩個檔案的内容如下:
– /etc/profile.d/mpich.sh:
#!/bin/bash
export MANPATH=${MANPATH}:/usr/local/mpi/man
export PATH=${PATH}:/usr/local/mpi/bin
– /etc/profile.d/mpich.csh:
#!/bin/csh
if ( $?MANPATH == 0 ) then
setenv MANPATH :/usr/local/mpi/man
else
setenv MANPATH ${MANPATH}:/usr/local/mpi/man
endif
setenv PATH ${PATH}:/usr/local/mpi/bin
步驟 5
要讓 MPICH 知道所有的節點,請編輯檔案 /tmp/mpich-1.x.x /util/machines/machines.LINUX,并将所有節點的主機名添加到這個檔案中,這樣安裝的 MPICH 就可以知道所有的節點了。如果以後再添加新的節點,也請修改這個檔案。
host1
host2
若是多CPU計算機,需要在節點名稱後用:num加以說明。
每個節點都這樣幹一遍。
步驟 6
将目錄 /tmp/mpich-1.x.x 拷貝到叢集中的所有節點上。
步驟 7
在 examples 中運作幾個測試程式:
現在叢集已經準備好了!正如我們可以看到的一樣,所有的重頭戲都可以留給 MPI 實作來完成。正如前面介紹的一樣,這是一個裸叢集,所需的大部分 手工 工作隻是確定機器之間可以彼此進行通信(我們配置了 ssh,MPICH 是手工拷貝的,等等)。
以設定的使用者登入(我的是linux)host1,将mpich-1.x.x /examples/basic/fpi.f檔案拷貝到
~/mpi/mirror下,編譯:
C 程式
mpicc -o cpi cpi.c .
mpirun -np 1 cpi
mpirun -np 2 cpi
Fortran 程式
mpif77 -o pi3 pi3.f .
mpirun -np 1 pi3
mpirun -np 2 pi3
mpif77 fpi.f,生成a.out檔案,運作:
mpirun -np 2 a.out —— 告訴 MPICH 在 2 個處理器上運作程式;如果配置中沒有 2 個處理器,也不用擔心;MPICH 會建立一些程序來補償實體硬體的缺失。
這裡采用2個節點進行計算。進行ssh連接配接後,程式等待輸入,這時可以在節點機上用指令:
ps -A | grep aout
檢視程序,應該能看到數個fpi程序,其中第一個是本機所執行的程序,其它的是異地程序
鏡像。在sea上輸入一個整值,再次在各節點上執行
ps -A | grep a.out
可以發現計算時間在不斷增長,表明計算的确是在多台主機上同時進行的。
至此,整個安裝配置過程結束
并行計算設計
在并行計算中,由于并行算法可以對性能産生重大的影響,是以受到廣泛的重視,并行算法也成為一個專門的十分活躍的研究領域,并行算法設計也是并行程式設計 的前提,沒有好的并行算法,就沒有好的并行程式。是以在并行程式設計之前,必須首先考慮好并行算法該算法要能夠将并行機和實際的問題很好地結合起來,既能 夠充分利用并行機體系結構的特點,又能夠揭示問題内在的并行性。
程式代碼:
用FORTRAN 77+MPI 實作的"HELLO WORLD"
program main
include 'mpif.h'
character * (MPI_MAX_PROCESSOR_NAME) processor_name
integer myid, numprocs, namelen, rc,ierr
call MPI_INIT( ierr )
C 程式初始化
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
C 得到目前程序号
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
C得到總的程序數
call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
C得到處理器名字
write(*,10) myid,numprocs,processor_name
10 FORMAT('Hello World! Process ',I2,' of ',I1,' on ', 20A)
call MPI_FINALIZE(rc)
C結束
end
輸出結果
Hello World! Process 1 of 2 on tp5
Hello World! Process 0 of 2 on tp5
【代碼分析】
MPI程式一般分為幾個部分?
講解:
第一部分,首先要有MPI相對于FORTRAN實作的頭檔案mpif.h,對于MPI相對于C語言的實作,其頭檔案是不同的。即用FORTRAN語言編寫的MPI并行程式,必須有MPI的FORTRAN頭檔案mpif.h。
第二部分,定義程式中所需要的與MPI有關的變量。MPI_MAX_PROCESSOR_NAME是MPI預定義的宏,即某一MPI的具體實作中允許 機器名字的最大長度,機器名放在變量processor_name中;整型變量myid和numprocs分别用來記錄某一個并行執行的程序的辨別和所有 參加計算的程序的個數;namelen是實際得到的機器名字的長度;rc和ierr分别用來得到MPI過程調用結束後的傳回結果和可能的出錯資訊。
第三部分,MPI程式的開始和結束必須是MPI_INIT和MPI_FINALIZE,分别完成MPI程式的初始化和結束工作。
第四部分,MPI程式的程式體,包括各種MPI過程調用語句和FORTRAN語句。MPI_COMM_RANK得到目前正在運作的程序的辨別号,放在 myid中;MPI_COMM_SIZE得到所有參加運算的程序的個數,放在numprocs中;MPI_GET_PROCESSOR_NAME得到運作 本程序的機器的名稱,結果放在processor_name中,它是一個字元串,而該字元串的長度放在namelen中;write語句是普通的 FORTRAN語句,它将本程序的辨別号,并行執行的程序的個數,運作目前程序的機器的名字列印出來,和一般的FORTRAN程式不同的是這些程式體中的 執行語句是并行執行的,每一個程序都要執行。不妨指定本程式啟動時共産生4個程序同時運作,而運作本程式的機器的機器名為"tp5",4個程序都在tp5 上運作,其辨別分别為0,1,2,3,執行結果如圖所示,雖然這一MPI程式本身隻有一條列印語句,但是由于它啟動了四個程序同時執行,每個程序都執行打 印操作,故而最終的執行結果有四條列印語句。
編寫一個FORTRAN+MPI的程式,實作每一個程序都列印出自己的程序号,總的程序數,本程序所在的機器名以及"SAY HELLO TO MPI"。
program main
include 'mpif.h'
character * (MPI_MAX_PROCESSOR_NAME) processor_name
integer myid, numprocs, namelen, rc,ierr
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
write(*,10) myid,numprocs,processor_name
FORMAT('Process ',I2,' of ',I1,' SAY HELLO TO MPI on ', 10A)
call MPI_FINALIZE(rc)
end
例子:
編寫一個C+MPI的程式,實作每一個程序都列印出自己的程序号,總的程序數,本程序所在的機器名以及"SAY HELLO TO MPI"。
#include "mpi.h"
#include <stdio.h>
#include <math.h>
void main(argc,argv)
int argc;
char *argv[];
{
int myid, numprocs;
int namelen;
char processor_name[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Get_processor_name(processor_name,&namelen);
f printf (stderr," Process %d of %d SAY HELLO TO MPI on %s/n",
myid, numprocs, processor_name);
MPI_Finalize();
}
實驗遇到問題
1.mpich無法安裝上去,出現說編譯後安裝通不過,make install°幾處出錯。
多次編譯解壓嘗試,make install 好像要運作兩次才行。
2.Linux網絡無法連結,實作機子間的通訊,不能簡單的ping
由于vm虛拟機的安裝會在windos系統上安裝兩個虛拟網卡,VMware的幾種網絡模式:
· bridged(橋接模式) :等于讓Guest和Host系統并列在同一個子網中,占用兩個ip,互相獨立
(對于綁定網卡的子網絡就不适用了,而且Guest的包就直接出去了,
Host管不了)
· host-only(主機模式) :對應Host裡面的"VMnet1",Guest的ip由VMware的DHCP提供,
相當于與Host網線直連
如果要通路外網,還需要手工做網橋。。。。
· NAT (網絡位址轉換模式) :這個對于讓Guest OS通路Internet是最簡單的,對應"VMnet8",
直接使用Guest認的網卡就行了,ip是VMware的DHCP對應VMnet8配置設定的,
與外網無關,但Guest對外的通路,會自動轉換出去,linux下的網絡中設定靜态ip,同時定義不同主機名。有的時候因為更改ip造成網絡後沒有激 活。或者是隻是更改了ip但在系統檔案中沒有修改而造成,可能要該host.equiv,hosts.machine幾個檔案,有的時候設定完畢後需要在 win網路上的芳鄰中重新開啟一次本地連結,同時設定38PO 上的 本地連接配接 2也能實作連結。
3.SSh使用的時候出現Connecton refused 的資訊錯誤。
由于是因為linux系統下的firework的級别設定的問題,把級别設定低就可以了。Setup指令來更改
4.Mpirun -np 2 a.out 并行計算出現 Child process exsied while making connection of remoto process on host2:0 Internet net
Send:could not write to fd=4,errno =32;
再最後次重新安裝按照上面的步驟沒有出現上面的問題了
實驗心得
通過本次實驗的學習,對并行程式設計有一個具體的基本的概念,對MPI有比較全面的了解,掌握MPI的基本功能,并且可以編寫基本的MPI程式,可以用 MPI來解決實際的比較基本的并行計算問題。實驗使我接觸和學習了很多知識,特别是對linux系統環境有了一個更深刻的認識,通過不斷的網絡的摸索和學 習, 對原先很不懂的linux目錄檔案,linux快捷鍵等等很好的認識,在後來的階段我感覺終端的操作還快于圖形界面的操作。也了解和弄清出了很多的概念, 叢集,并行,節點,mpich,在實驗過程中也接觸了其他的知識(如何windows通路Linux系統,用Putty等軟體來實作,怎麼實作Linux 系統下面加載windos分區等等ext2fsnt)
vi 指令的使用 vi 檔案名,ls 操作檔案顯示檔案屬性等等,ls –l ls –a alt+F1 系統菜單 F7窗體的移動。終端中首字母+Tab快速輸入檔案名 顯示主機名hostname -a更改主機名hostname host1 本機ip hostname -i
指令來關閉防火牆
用IPTables -F 或setup
開啟ssh
/etc/rc.d/init.d/sshd restart 或者 service sshd start
測試 netstat -tl
rsh 開啟 /etc/rc.d/init.d/xinetd restart
測試 netstat -an /grep 514
各種服務 ntsysv
網絡狀态檢視 netstat -x (x包括i,t,s,r)
修改檔案權限chmod
MPI程式中的輸出語句和一般串行程式中輸出語句的執行結果的不同――MPI程式中的輸出語句每一個程序都執行,執行時有幾個程序就有幾條輸出語句,而串行程式中輸出語句隻有本程序輸出結果。
不同程序對同一個内容的輸出,其順序是随機的。
當然,目前的實驗知識最基本的裸機的實驗。真正的知識和應用還遠遠不夠
Linux叢集管理,如何有效地實作簡單而高可維護行的linux叢集,用的其他的工具等等,實驗中存在暴露了自己很多存在的不足之處,努力在今後的程式設計 中不斷的加強改進。當然這次實驗做的不是很完整,但給我一次很好的鍛煉的機會,無論是練習和嘗試都好,對自己的能力的認識,對新知識的吸收都是一個挑 戰,Linux一個優秀的系統,我想它對我的吸引一定會使我在今後不斷自我。叢集一個很實用且是目前廣泛應用的東西,希求能更遠更好的認識和掌握它。