2010-07-23 220 views
5

今年夏天我正在做一些研究,並且正在致力於對現有代碼進行並行化。現在主要關注的是負載平衡代碼的方式,以便在集羣上運行更高效。目前的任務是做一個概念驗證,創建幾個進程,每個進程都有自己的堆棧可用,當進程完成堆棧處理時,它會查詢兩個最接近的進程,以查看堆棧中是否有更多可用的工作。使用Python實現負載平衡

我很難在python中對此進行概念化,但希望有人能指出我朝着正確的方向,或者有某種類似的mpi4py或ParallelPython類似的例子。此外,如果有人知道更好或更簡單的模塊,那麼這將是很好的瞭解。

謝謝。

回答

11

下面是一個簡單的方法來做到這一點。

  1. 創建工作做的一個共同的共享隊列。這個應用程序 將填補工作要做的工作。

  2. 創建一個應用程序,從隊列中獲取一個項目並完成工作。

這是單生產者多用戶設計。它運行良好,可以用並行進程淹沒你的機器。

要使用內置隊列類,您需要將隊列包裝在某種 多處理API中。 http://docs.python.org/library/queue.html。就我個人而言,我喜歡創建一個處理隊列的基於HTTP的小型Web服務器。每個應用程序都會執行 GET來獲取下一項工作。

您可以使用像RabbitMQ這樣的工具來創建一個非常漂亮的共享隊列。 http://nathanborror.com/posts/2009/may/20/working-django-and-rabbitmq/

您可能可以使用http://hjb.python-hosting.com/來使用JMS隊列。

您需要一個小應用程序來創建和填充工作隊列。

根據需要創建儘可能多的應用程序副本。例如:

for i in 1 2 3 4 5 6 7 8 9 10 
do 
    python myapp.py & 
done 

這將運行10個併發副本的應用程序。所有10個人都試圖從一個隊列中獲得工作。他們將使用所有可用的CPU資源,操作系統將很好地爲你安排它們。


對等節點到節點同步意味着您在所有節點之間都有O(n *(n-1)/ 2)個通信路徑。

「兩個相鄰節點」意味着你仍然有2 * n個通信路徑,並且工作必須「以某種方式」在節點之間流動。如果節點最初都是在工作中播種,那麼有人做了很多計劃來平衡工作量。如果你打算做這麼多規劃,爲什麼要求節點同步呢?

如果隊列沒有仔細平衡開始,那麼每個偶數節點可能會變慢。每個奇怪的節點可能會很快。奇數節點首先完成,檢查來自兩個偶數節點的工作,並且這些節點(a)沒有完成,並且(b)沒有更多的工作要做。現在怎麼辦?一半節點正在工作,一半正在閒置。所有這些都是由於在最初的工作分配中計劃不周。

主從表示您有n條通信路徑。此外,由於所有空閒節點都有相同的工作權限,因此平衡是自動的。不存在導致整體績效不佳的偏向初始分配的情況。

+0

謝謝你,這是類似程序的當前設計,但他們希望有到節點結構的,而非主從結構的節點。還有,從多個進程訪問多次的單個隊列會在羣集上造成可能的瓶頸? – patemotter 2010-07-23 19:44:16

+0

@DistortedLojik:單個隊列不應該是一個問題,除非每個工作包都是微小的。這是純粹的開銷,因此您希望將隊列訪問的成本分攤到許多高價值工作上。 – 2010-07-23 19:47:43