2012-06-11 126 views
4

我有一系列需要完成的工作;工作之間沒有依賴關係。我正在尋找一種能夠幫助我將這些工作分配給機器的工具。唯一的限制是每臺機器只能一次運行一項作業。我試圖最大化吞吐量,因爲這些工作不是很平衡。我目前黑客一起使用shell腳本的效率並不高,因爲我預先構建了每臺計算機的作業隊列,並且無法將作業從負載較重的計算機的隊列移動到正在等待的計算機,並且已經完成了所有工作。小規模負載均衡

以前的建議已經包括SLURM,這似乎是過度殺傷,甚至更多矯枉過正LoadLeveller。

GNU Parallel看起來像我想要的,但遠程機器不會說SSH;有一個自定義的作業啓動器(沒有排隊功能)。我想要的是Gnu Parallel,它可以在工作分派之前立即將機器替換爲shell腳本。

因此,簡言之:

  • 機器可以接受的作業+目錄的列表:最大限度地提高吞吐量。儘可能接近殼體是首選。

最糟糕的情況可以用bash的lockfile破解一些東西,但我覺得好像更好的解決方案必須存在某處。

+0

你有沒有考慮使用殼內置作業?類似while#jobs> = maxjobs sleep .1;命令& – technosaurus

回答

2

假設你的工作是在一個文本文件jobs.tab看起來像

/path/to/job1 
/path/to/job2 
... 

創建dispatcher.sh,就像這樣

mkfifo /tmp/jobs.fifo 
while true; do 
    read JOB 
    if test -z "$JOB"; then 
    break 
    fi 
    echo -n "Dispatching job $JOB .." 
    echo $JOB >> /tmp/jobs.fifo 
    echo ".. taken!" 
done 
rm /tmp/jobs.fifo 

和運行的

dispatcher.sh < jobs.tab 

一個實例現在創建launcher.sh

while true; do 
    read JOB < /tmp/jobs.fifo 
    if test -z "$JOB"; then 
    break 
    fi 

    #launch job $JOB on machine $0 from your custom launcher 

done 

和運行的launcher.sh每個目標機器一個實例(給機器作爲第一個也是唯一一個參數)

+0

看,我知道必須有一個簡單的選擇。謝謝!我會盡快嘗試,但在檢查時看起來不錯。我只接受這一點。 –

+0

所以在我的機器上,它看起來像在終止時有一些奇怪的邊緣情況行爲。總的來說,一切正常,但最後發射器都會等待來自FIFO的輸入。 就我而言,我已經通過向每個啓動器發送一個標記值(「quit」)(檢查存在的啓動器的進程列表)來解決它。 –

+0

TBH我沒有任何檢查就沒有100%確定'rm/tmp/jobs.fifo',但它在我簡單的測試案例中起作用。哨兵是一個優秀和強大的想法。 –

1

GNU並行支持自己的ssh命令。所以這應該工作:

function my_submit { echo On host $1 run command $3; } 
export -f my_submit 
parallel -j1 -S "my_submit server1,my_submit server2" my_command ::: arg1 arg2 
+0

感謝您的支持,它看起來像另一個很好的答案。只是好奇,是否有提交函數的args文檔?我在[manpage](http://www.gnu.org/software/parallel/man.html)中找不到它。 –

+0

上面定義了bash函數'submit'。它不在任何手冊頁中。更改函數'submit'以適應您的需求。我將名稱更改爲my_submit,強調它是由您定義的。 –

+0

所以我跟着。我從這裏得到的理解是,在封面下,而不是執行'ssh server1 ... my_command arg1',而是執行'my_submit server1 ... my_command args'。我很好奇的是第二個參數'...',我可以用它做很酷的事情嗎? –