1. 程式人生 > >docker搭建linux叢集,搭建mpi環境,並使用MTT benchmark測試叢集效能

docker搭建linux叢集,搭建mpi環境,並使用MTT benchmark測試叢集效能

最近在研究docker,早些時候老闆讓做了一個open mpi的image,並在單機環境下,成功使用docker搭建了一個openmpi的叢集,可以跑一些hello world的例子,後來,在ubuntu環境下,使用openvswitch搭建了一個多host的叢集,在coreos環境下,使用etcd鍵值對服務和搭建了一個叢集,並分別通過tunnel的方式,和flannel的方式,修改docker -d的引數,使得,在不同的host主機上,可以執行在同一個子網內的container,並且相互之間可以通訊。(好像我還沒有來得及記錄下來怎麼做的)。前幾天老闆說,你成功搭建了,跑hello world的例子也成功了,但是你這個效能怎麼樣,多host情況下,你是通過tunnel橋,或者flannel實現的,那麼你這樣的效能和單host肯定是不一樣的,效能差多少呢?你要找個benchmark來檢驗一下,所以,我就找了個openmpi的mtt來測試一下,這裡做個記錄。
我們先來說說mtt是個什麼東西,mtt是一個檢驗mpi環境的,不只是openmpi,包括別的版本的mpi也是可以的。第一,mtt會檢驗你是否正確安裝了mpi,甚至mtt可以幫助你安裝mpi。第二,mtt會檢驗你寫的程式碼是否可以通過安裝的mpi成功編譯。第三,mtt會檢驗你寫的程式是否可以正確在叢集環境中執行,並返回叢集中雲心的結果,包括是否成功啊,花費的時間等。第三個特點,也正是我們需要的功能。
首先要明確的一個觀點就是,肯定要搭建一個nfs,或者說,也可以使用別的方法,比如開個docker container作為data container,然後通過這種方式同步也可以,如果單節點當然可以,但是在多節點的時候就不可以了,因為data container不能跨節點共享資料。我們為什麼要在不同節點之間共享資料呢?想象一下,我們在執行mtt的時候,他會執行我們的測試程式,那麼這個測試程式,理論上只有在我們執行mtt的host才會有,那麼怎麼讓那些slave節點也去執行這個程式呢?mtt並不幫助我們把測試程式傳到slave節點上去,需要我們自己拷貝,或者通過別的簡單方式,別如我們剛剛說的通過data container的方式,或者nfs。由於我們需要在不同的host節點上建立slave,所以我們這裡肯定要搭建nfs服務。否則在執行mtt的時候,會報cannot find execute path file之類的錯誤。
  • 搭建nfs服務

    首先,在主host上安裝nfs服務。
    sudo apt-get install nfs-kernel-server
    sudo apt-get install nfs-common

    注意一定要安裝nfs-common服務,有的文章指出不需要安裝,因為在安裝nfs-kernel-server的時候,會自動安裝nfs-common和nfs-portmap,我嘗試後發現,portmap是自動安裝了,但是,並沒有安裝nfs-common,會報
    mount wrong nfs type, bad option, bad superblock on XXX
    的錯誤。
    然後,配置nfs共享目錄。假如我們需要共享的目錄是/home/monkey/nfs資料夾下的所有文件,那麼我們就需要配置/etc/exports檔案,在最後一行,加上這麼一句。
    "/home/monkey/nfs" *(rw,sync,no_subtree_check)


    至於這句話什麼意思,前面的路徑肯定就是我們要共享的nfs檔案,後面的的意思是,所有ip段的機器都可以共享這個路徑,如果你要指定某個機器,可以直接把替換成那臺機器的ip,比如114.212.87.52,或者你要指定某個子網段的機器,可以這樣寫,114.212.0.0/24,這種東西查查nfs配置就知道了,我們這裡不作為重點。後面的rw是讀寫許可權,ro是read only,sync是同步等,自己查查文件。
    配置好後,重啟服務,
    sudo /etc/init.d/portmap resatrt
    sudo /etc/init.d/nfs-kernel-server restart
    就可以了。我們可以輸入showmount -e
    來進行檢視。
    這裡寫圖片描述
    ok,這樣nfs就配置完成了。

  • docker配置多節點mpi cluster
    這一步就比較簡單了,因為我們之前已經做好了open mpi的image,在docker hub上也有,如果有同學不想自己做的話,可以自己去下載,名字是hmonkey/openmpi14.04:v3。啟動的時候,一定要注意給container超級許可權。否則會出現掛載nfs共享資料夾的時候報錯的問題。
    cannot mount on ip readonly
    類似於這樣的錯誤。
    sudo docker run -ti --name master --privileged=true hmonkey/openmpi14.04:v3 /bin/bash
    sudo docker run -ti --slave1 --privileged=true hmonkey/openmpi14.04:v3 /bin/bash
    sudo docker run -ti --slave2 --privileged=true hmonkey/openmpi14.04:v3 /bin/bash

    這樣就起來了三個節點,其中我們把其中的一個座位master,另外的兩個座位slave。起來之後,要做兩件事,第一,我忘記在image裡面自動啟動ssh服務,所以,起來之後,要首先把ssh服務啟動起來,分別執行sudo service ssh start其次,要在master裡面把slave的ip加到host列表裡面去,這樣才可以方便的訪問。在master上vim /etc/hosts,把slave1和slave2的地址加上去。
    這裡寫圖片描述
    這樣,就配置好叢集環境了。由於我們這裡已經設定好ssh進去的時候不需要輸入密碼,這一步就可以省略了。關於如何配置不需要密碼就可以直接ssh進去,請檢視我別的blog。
    cd /
    sudo mkdir nfs
    sudo mount ip:/home/monkey/nfs /nfs

    這樣就可以了,這樣就把宿主機的nfs資料夾,和當前container的nfs資料夾同步起來了,在三個container上都要這麼做。

  • 下載mtt並執行
    在master容器內,
    cd /
    git clone https://github.com/open-mpi/mtt
    cd mtt/sample
    cat developer.ini trivial.ini | ../client/mtt - hostlist=slave1,slave2 alreadyinstalled_dir=/usr --scratch=/nfs

    最後一句命令比較難以理解。其中,developer.ini裡面是檢測你是否正確安裝了mpi,trivial.ini是跑測試的程式的。../client/mtt是mtt的執行指令碼,hostlist是要檢驗的叢集中的機器,alreadyinstall_dir是你把mpi安裝在哪裡了,scratch是最重要的,是要寫配置的nfs共享目錄在container裡的位置。
    這裡寫圖片描述
    這裡寫圖片描述
    大功告成。