2012-12-17 126 views
7

從GNU的文檔製作:http://www.gnu.org/software/make/manual/make.html#Parallel如何在多核Linux機器上使用GNU make -max-load?

當負載較重的系統,你可能會想跑得比當輕載它 的就業機會較少。您可以使用'-l'選項 tell make根據 負載平均值限制一次運行的作業數量。 '-l'或' - max-load'選項後面跟着一個浮點數 。例如,

-l 2.5 

如果負載平均值超過2.5,則不會讓多個作業啓動。 沒有以下數字的'-l'選項將刪除裝載限制,如果其中一個 與以前的'-l'選項一起給出。

更確切地說,當make開始一個工作,並且它已經有至少一個工作正在運行時,它檢查當前的平均負載;如果它是 不低於'-l'所給出的限制,則等待,直到負載 平均值低於該限制,或直到所有其他作業完成。

從Linux手冊頁的正常運行時間:http://www.unix.com/man-page/Linux/1/uptime/

系統負載均衡是是 無論是在可運行或不間斷狀態的平均進程數。可運行的 狀態中的進程使用CPU或等待使用CPU。處於不可中斷狀態的進程 正在等待某些I/O訪問,例如等待 用於磁盤。平均值是在三個時間間隔內進行的。 負載平均值未針對系統中的CPU數量進行標準化, 因此負載平均值1表示單個CPU系統在4 CPU系統上加載所有 時間,這意味着它在75%的時間內處於空閒狀態。

我有一個平行的makefile,我想要做的明顯的事情:已經做出繼續增加處理,直至我得到充分的CPU使用率,但我不會引起抖動。

今天許多(所有?)機器都是多核的,所以這意味着平均負載不是應該檢查的數量,因爲這個數字需要根據內核數量進行調整。

這是否意味着GNU make的--max-load(aka -l)標誌現在是無用的?那些在多核機器上運行並行makefile的人們在做什麼?

回答

0
今天

很多(所有?)機器是多核,這樣就意味着負載 平均值不數化妝應該檢查,作爲核心的數量來調整這個數字 需要。

這是否意味着GNU make的--max-load(aka -l)標誌現在是 沒用了?

不是。想象一下具有高要求磁盤I/O的作業。如果您開始的任務數多於CPU,那麼您仍然不會很好地使用CPU。

就個人而言,我只是用-j因爲到目前爲止它已經足夠好了給我。

0

即使是構建在CPU是瓶頸,-l並不理想。我使用-jN,其中N是存在的或我想要在構建上花費的核心數量。選擇一個更大的數字並不會加速我的情況。它沒有任何慢下來,只要不太過火(如通過-j指定無窮大)。

使用-lN大致相當於-jN,並能更好地工作,如果機器有其他獨立的工作要做,但有兩個怪癖(你所提到的人,不佔核心數量分開):

  • 初始尖峯:當構建開始時,使得啓動大量作業,比N多得多。當進程分叉時系統負載數量不會立即增加。這在我的情況下不成問題。
  • 飢餓:相比其他一些構建工作需要很長的時間,前M快速作業已經結束的那一刻,系統負載仍然>ñ。不久,系統負荷下降到N - 男,但只要那幾個慢作業拖延,沒有新的作業啓動,核心是捱餓。當舊的作業結束,並開始只是想着推出新的就業機會。它沒有注意到系統負載在兩者之間下降。
5

我的簡短回答:--max-load是非常有用的,如果你願意投入時間來充分利用它。在目前的實施中,沒有簡單的公式來選擇好的價值,或者是發現它們的預製工具。


我維護的版本相當大。在我開始維護它之前,這個版本是6個小時。使用虛擬硬盤上的-j64,現在它在5分鐘內完成(在NFS安裝上使用-j12)。我的目標是找到-j-l的合理上限,它允許我們的開發人員快速構建,但不會使服務器(構建服務器或NFS服務器)對其他人無法使用。

首先:

  • 如果選擇合理-jN值(你的機器),並找到平均負載合理的上限(你的機器上),他們的工作很好地合作,讓事情均衡。
  • 如果使用一個非常大的值-jN(或未指定;例如,-j沒有數字),並限制了平均負載,使用gmake將:
    • 繼續產卵過程(使用gmake 3。81增加了一個調節機制,但不僅有助於緩解這個問題一點),直到達到作業的最大#或直至平均負載必須高於你的門檻
    • 而平均負載是在你的門檻:
      • 什麼也不做,直到所有的子過程是在一個時間
    • 完成
    • 產卵一個作業做一遍

在Linux上至少(也可能是其他* nix變體),load average isexponential moving average(UNIX Load Average Reweighed,Neil J. Gunther)表示等待CPU時間的平均進程數(可能由過多進程引起,等待IO,頁面錯誤等)。由於它是一個指數移動平均數,所以它的權重使新樣本對當前值的影響比舊樣本更強。

如果您可以通過正確的最大負載和並行作業數量(通過受過良好教育的猜測和經驗性測試的結合)確定一個良好的「甜蜜點」,假設您有一個長時間運行的構建:您的1分鐘平均命中平衡點(不會波動太多)。但是,如果您-jN數過高,給定的最大平均負載,它會波動相當多。

找到最佳點基本上等同於找到微分方程的最佳參數。因爲它會受到初始條件,重點是在發現獲得系統留在平衡,而不是想出「靶」平均負載參數。 「平衡」我的意思是:1米負載平均波動不大。

假設你不是在使用gmake限制瓶頸:當你發現了一個-jN-lM組合給出最小編譯時間:該組合將力推你的機器到了極限。如果機器需要被用於其他目的......

compiling

...你可能想縮放回位,當你完成優化。

不考慮負載平均,我看到在建設時間增加-jN的改善似乎是[粗略]對數。也就是說,我看到-j8-j12之間的差異大於-j12-j16之間的差異。

觀光見頂我某處-j48-j64之間,因爲最初使用gmake過程是單線程(Solaris計算機它是關於-j56上);在某些時候,線程無法以比完成更快的速度啓動新的作業。

我測試的執行方式:

  • 非遞歸構建
    • 遞歸構建可以看到不同的結果;他們將不會遇到我所做的瓶頸-j64
    • 我盡我所能,儘量減少配方中的make-isms(變量擴展,宏等)數量,因爲配方分析發生在產生並行的同一個線程中工作。越複雜的食譜,它在解析器中花費的時間越多,而不是產卵/收穫作業。例如:
      • $(shell ...)宏用於食譜;那些是在第一解析通過期間跑和緩存
      • 大多數變量與:=被分配,以避免重複膨脹
  • 的Solaris 10/SPARC
    • 256核
    • 沒有虛擬化/邏輯域
    • 構建在虛擬磁盤上運行
  • x86_64的Linux的
    • 32芯(4×超線程)
    • 沒有虛擬化
    • 構建跑了快速的本地驅動器