2012-07-24 30 views
9

有什麼辦法可以強制make -j不會消耗我的內存嗎?我在開發團隊工作,並且我們有不同的硬件設置,因此-j8可能不適合每個人。但是,make -j爲我使用了太多的RAM,並且溢出到swap中,這可能會損壞我的整個系統。我怎樣才能避免這種情況?使-j內存限制

理想情況下,我想讓系統加載並停止產生新線程,等待一些完成,然後繼續。

+0

GNU讓在Linux/Unix? – Chimera 2012-07-24 21:32:22

+0

'讓--version'報告GNU使3.81 – Drise 2012-07-24 21:33:44

回答

4

稍微簡單的解決方案是每個工作站都有一個適合硬件可以處理的環境變量。讓makefile讀取這個環境變量並將其傳遞給-j選項。 How to get gnu make to read env variables.

此外,如果構建過程有很多步驟並且需要很長時間纔會重新讀取環境變量,以便在構建過程中可以減少/增加資源使用量。

此外,也許有,做資源使用情況的監控工作站上運行的服務/應用程序和修改環境變量,而不是試圖有make做...

+1

什麼硬件能夠處理取決於什麼正在編制,不能因爲-j選項一無所知建設各類時所需的內存使用情況最好通過化妝-j控制資源。例如,-O0 vs -O2或C vs C++或GCC vs Intel編譯器。 – 2013-10-06 17:14:27

3

還有另一種方式來做到這一點:

(從http://www.gnu.org/software/make/manual/html_node/Parallel.html#Parallel

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

-l 2.5如果平均載荷高於2.5,則不會讓多個作業開始。沒有以下數字的'-l'選項將刪除 裝載限制(如果使用先前的'-l'選項給出的)。

如果你擔心所有的RAM變得笨拙,這可以幫助。在這種情況下,「負載」是指正常運行時間或主要報告。如果你正在交換,或者更糟糕的話,顛簸,負載將會激增。您可以嘗試使用此選項的值。您應該觀察非平行構建過程中的負載水平,並在您增加make的並行過程的數量時觀察。這應該爲您的機器提供合理的基準。

+0

唯一的問題是*我們有不同的硬件集*。但是這可能工作。 – Drise 2012-07-24 22:11:03

+1

無關緊要,一個合理的負載限制應該完全按照你想要的來完成,而且大部分都是獨立於硬件的。 *我也可以輸入斜體*。 – 2012-07-24 22:16:22

+0

@ keith.layne是的,好點。假設在這種情況下負載與RAM使用率相關。 – Chimera 2012-07-24 22:35:51

-1

是否有可能使-j做了些混淆? (至少我錯了很久......)。我認爲沒有選項的-j將適應CPU的數量,但它不會 - 它根本不適用任何限制。這意味着對於大型項目,它會創建大量進程(只需運行「top」即可看到...),並可能耗盡所有內存。當我的項目的「make -j」使用了我所有的16Gb內存並失敗時,我偶然發現了這個問題,而「make -j 8」在2.5Gb內存使用情況下達到頂峯(在8個內核上,負載接近100%兩種情況)。

就效率而言,我認爲使用一個等於或大於最大CPU數量的限制會更有效率,沒有限制,因爲數千個進程的調度有一些開銷。創建的進程總數應該是不變的,但是由於「-j」會一次創建大量進程,所以內存分配可能會成爲問題。即使將限制設置爲CPU數量的兩倍也應該更加保守,而不是設置限制。

PS:經過一些挖我想出了一個巧妙的解決辦法 - 只要讀出處理器的數量和使用,作爲-j選項:

make -j `nproc`