2016-06-28 59 views
1

我有多個bash腳本,我試圖在主bash腳本中「並行化」。Unix環境中的多線程/並行Bash腳本

bash腳本:

#!/bin/bash 
SHELL=/bin/bash 

bash /home/.../a.sh & 
bash /home/.../b.sh & 
wait 
bash /home/.../c.sh & 
bash /home/.../d.sh & 
bash /home/.../e.sh & 
wait 
echo "Done paralleling!" 
exit 0 

我已經正常運行腳本(不含和符號),並與&號,我沒有看到處理時間任何明顯的差異,導致我相信的東西可能不正確編碼/最有效的方式。

+0

很可能,並行實例可能需要更長的時間*,因爲它們都必須使用相同的物理資源:磁盤驅動器)。由於Linux *(et al)*能夠在幕後使用非常有效的緩衝,因此一個* single * process實例可能能夠更加高效地完成I/O請求,而如果它被「埋沒「通過許多進程或多或少做同樣的事情。只需對它進行基準測試,並且如果「&」符號實際上不會在機器上使事情明顯變得更快,那麼就放棄這個想法。 *「哦,這似乎是一個好主意,但是......」* –

+0

如果你正在尋找更多的並行工作,請看看GNU Parallel。它會爲你做很多平行工作,並且是生產質量。 –

回答

1

在經典的計算機科學理論中,資源爭用被稱爲「顛簸」。 (在好日子裏,當一個5兆字節的磁盤驅動器可能是一臺小型洗衣機的大小時,我們習慣稱它爲「Maytag模式」,因爲這個可憐的東西看起來像一臺Maytag洗衣機在「旋轉」循環中!)

如果您繪製由競爭引起的性能曲線,它向上傾斜,然後突然有一個「肘」形狀:它以指數形式直線上升。我們稱之爲「撞牆」。

一個有趣的事情來擺弄這個腳本(如果你只是好奇...)是把wait陳述在幾個地方。 (請確保你正確地做到了這一點...)允許,比如說,兩個實例運行,等待所有這些實例完成,然後再運行三個實例,依此類推。看看這是否有用得更快,如果是,請嘗試三次。等等。你可能會發現一個「甜蜜點」。

或...不是。 (不要花太多時間,看起來並不值得)

1

你很可能是對的。並行的東西是它允許你抓取多個資源並行使用。如果 - 且僅當 - 資源是您的限制因素時,這會提高您的速度。

因此 - 例如 - 如果您正在從磁盤讀取數據 - 從磁盤讀取數據的行爲是限制您的行爲,而並行執行並不會有所幫助 - 事實上,由於爭用可以減慢過程。 (磁盤必須尋求爲多個進程提供服務,而不僅僅是'繼續'並串行化讀取)。

所以它真的歸結爲你的腳本實際上和它爲什麼很慢。最好的方法是通過分析來檢查。

在基本的層面上,桁架或strace可能會有所幫助。

例如

strace -fTtc /home/../e.sh 

然後看看正在進行什麼類型的系統調用以及它們消耗的總時間有多少。