0

以下是與我所問的問題相關的代碼。我正在處理一個有13個計算節點和1個頂級節點(又名主節點)的集羣。頂層節點是連接所有用戶的節點,因此它可以分配更多內存,因此運行速度更快。然而,我想提高其他節點的速度,因爲它們相對於頂級節點運行速度非常緩慢,並且我希望在不進行任何服務器和/或硬性調整的情況下提高速度。考慮到這些限制,我想知道是否有一種方法可以基於我如何在計算節點上啓動模擬來實現更快的計算。目前,爲了在某些初始條件下啓動部分仿真(這可以在下面看到),我只需ssh到計算節點上,然後啓動我的仿真。有沒有更好的方法來做到這一點,可以提高計算速度(我認爲可能比ssh更快)?任何幫助將不勝感激....我知道有一些所謂的MPI,但我對我的工作不相信實施MPI將是必要的,如果我可以提高SSH連接節點的計算速度項目... 謝謝。如何提高Linux羣集上計算節點的並行處理速度?

./NodeHopper.sh

#!/bin/sh 
#NodeHopper uses shell script to run psuedo-parallel computing over a cluster 

#The top node is not named sequentially, so its not in the proceeding loop. 
#Instead, it is given the node value 13 for computations later 

export PROG=13 
nohup ./ParaCage.sh & #Runs ParaCage.sh on the main node for the cluster 

#Does other nodes sequentially #0 through 12 
for i in {0..12} 
do 
    export PROG=$i 
    #PROG is passed into ./ParaCage.sh and tells ./ParaKeet.sh which initial conditions 
    #to use for the simulation. 
    ssh compute-0-$i PROG=$PROG ./ParaCage.sh & 
    sleep 1 
done 

./ParaCage.sh

#!/bin/sh 
echo "Tunneling to Node:" 
echo $PROG 
echo "Complete" 

cd multichmoII/multichmo$PROG/chmo/ 
./ParaKeet.sh 

ParaKeet.sh

ParaKeet.sh是運行的程序使用基於哪個節點的不同初始條件進行仿真正在使用。

回答

0

我想知道是否有一種方法可以實現更快的計算,這取決於我如何在計算節點上啓動模擬。

那麼,你的SSH啓動腳本中有一個sleep。你可以嘗試刪除它。

SSH確實有一些開銷(產生一個新的進程的每一個「消息」;不僅加密連接,即使你可能並不需要它)。所以你可以用合適的分佈式任務隊列替換SSH。有很多選擇,包括CeleryResque。實際上,您可以使用Redis或0MQ輕鬆編寫自己的代碼。

但不要打擾更換SSH,除非你的工作是短暫的。 (即從1分鐘的工作中削減100ms並不是那麼有用。)

我想增加其他節點

沒有銀彈的速度:最好的辦法是把你的偵探帽,試圖找出其中的瓶頸是:

1)看看其他節點上的「頂部」。所有的CPU都被最大化了嗎? (如果沒有,你可能想每個CPU產生一個任務,而不是每個盒子一個任務,或者重寫你的任務以使用多個線程。)

2)每個節點是否從中央(和超載)的NFS服務器? (如果是這樣,在本地複製/緩存文件可能會更快,或者有多個服務器從中拉出數據,或者使用bittorrent等。)

3)即使您的CPU最大化,是因爲您用腳本語言寫的?首先,優化你的算法,然後嘗試以更快的語言重寫,如golang。 (並免費獲得多線程。)

請記住,不成熟的優化是萬惡之源。你應該總是測量,然後嘗試估計你能夠更快地完成每個部分。首先選擇低掛果,留下最後的最小漲幅。 (你可能永遠不會得到小的收益,因爲更重要的東西會彈出。)

0

也許你應該從bash中移動到Python,並使用多線程有?然後你可以並行的ssh到節點,這可以提高速度。

+0

是不是這個程序正在做什麼?看着我的數據,我開始懷疑這一點。所有計算節點都運行相同的條件,並且頭節點正在運行得很好......它們是否真的沒有並行運行?我雖然通過踢他們這樣的方式,他們會...... – Loonuh

0

根據您正在運行的模擬的性質,它可能是更好的劃分模擬本身了 - 和並行過程。如果每個節點的功能不足以自己有效地運行程序,就會出現這種情況。另一方面,如果仿真很容易分解爲並行線程---每個線程使用更少的內存/處理器功耗---那麼每個節點可能非常適合處理分配給它的每個組件。