2012-07-24 15 views
9

Czy istnieje sposób, aby zmusić make -j, aby nie zużywała mojej pamięci RAM? Pracuję w zespole programistów i mamy różne zestawy sprzętowe, więc -j8 może nie być optymalne dla każdego. Jednakże, make -j używa dla mnie zbyt dużo pamięci RAM i rozlewa się na swap, który może usunąć cały mój system. Jak mogę tego uniknąć?Make -j Ograniczenia pamięci RAM

Najlepiej byłoby, gdybym chciał obejrzeć obciążenie systemu i zatrzymać tworzenie nowych wątków, poczekać na zakończenie niektórych i kontynuować.

+0

GNU make na Linux/Unix? – Chimera

+0

'make --version' zgłasza GNU Make 3.81 – Drise

Odpowiedz

4

Dosyć proste rozwiązanie byłoby dla każdej stacji roboczej mieć zmienną środowiskową, która jest odpowiednia do tego, co sprzęt może obsłużyć. Niech makefile odczyta tę zmienną środowiskową i przekaż ją do opcji -j. How to get gnu make to read env variables.

Ponadto, jeśli proces kompilacji ma wiele kroków i zajmuje dużo czasu, należy ponownie odczytać zmienną środowiskową, aby podczas budowania zmniejszyć/zwiększyć wykorzystanie zasobów.

Również może mieć usług/aplikacji działających na stacji roboczej, dokłada monitorowania wykorzystania zasobów i modyfikować zmienną środowiskową zamiast starać się mieć make zrobić ...

+1

To, co może obsłużyć sprzęt, zależy od tego, co jest kompilowane i nie może być optymalnie kontrolowane przez make -j, ponieważ opcja -j nie wie nic o używaniu pamięci RAM podczas budowania różnych typów źródło. Na przykład -O0 vs -O2 lub C vs C++ lub GCC vs kompilatory Intel. –

3

Nie ma innego sposobu, aby to zrobić :

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

gdy system jest mocno załadowany, prawdopodobnie będziesz chciał uruchomić mniej miejsc pracy niż gdy jest lekko załadowany. Możesz użyć opcji "-l" do tell make, aby ograniczyć liczbę zadań do wykonania naraz, na podstawie średniej obciążenia obciążenia . Po opcji -l lub -max-load następuje numer zmiennoprzecinkowy . Na przykład:

-l 2.5 nie pozwoli uruchomić więcej niż jednego zadania, jeśli średnia obciążenia przekracza 2,5. Opcja "-l" bez następującego numeru usuwa limit obciążenia , jeśli podano go z poprzednią opcją "-l".

Jeśli martwisz się, że cała pamięć RAM zostanie uszkodzona, może to pomóc. "Wczytaj" w tym przypadku jest w tym sensie, że uptime lub top raporty. Jeśli wymieniasz się, lub gorzej, rzucasz, ładunek wystrzeli. Możesz eksperymentować z wartościami dla tej opcji. Powinieneś obserwować poziomy obciążenia podczas nierównoległej budowy i obserwuj jak zwiększasz liczbę równoległych procesów make. Powinno to dać rozsądną podstawę dla twojej maszyny.

+0

Jedynym problemem jest to, że * mamy różne zestawy sprzętu *. Ale to może zadziałać. – Drise

+1

Nie powinno mieć znaczenia, rozsądny limit obciążenia powinien zrobić dokładnie to, co chcesz, w większości niezależne od sprzętu. * Mogę też wpisać kursywę *. –

+0

@ keith.layne Tak, dobry punkt. Zakładając, że w tym przypadku obciążenie koreluje z użyciem pamięci RAM. – Chimera

-1

Czy jest możliwe, że istnieje pewne zamieszanie, co robi make -j? (przynajmniej źle się przez długi czas ...). Zakładałem, że -j bez opcji dostosuje się do liczby procesorów, ale tak nie jest - po prostu nie stosuje żadnego limitu. Oznacza to, że w przypadku dużych projektów stworzy ogromną liczbę procesów (wystarczy uruchomić "top", aby zobaczyć ...) i ewentualnie zużyć całą pamięć RAM. Natknąłem się na to, gdy "make -j" mojego projektu użyło całego mojego 16 GB pamięci RAM i nie powiodło się, podczas gdy "make -j 8" osiągnęło szczyt przy użyciu pamięci RAM 2,5 Gb (w 8 rdzeniach obciążenie jest bliskie 100% oba przypadki).

Pod względem wydajności, myślę, że użycie limitu równego lub większego niż maksymalna liczba procesorów, które są oczekiwane, jest bardziej wydajne niż brak ograniczeń, ponieważ planowanie tysięcy procesów ma pewien narzut. Całkowita liczba utworzonych procesów powinna być stała, ale ponieważ "-j" tworzy wiele z nich naraz, przydzielanie pamięci może stać się problemem. Nawet ustawienie limitu na dwa razy większą liczbę procesorów powinno być jeszcze bardziej zachowawcze niż ustawienie limitu.

PS: Po jakimś bardziej kopanie wymyśliłem estetycznym rozwiązanie - po prostu odczytać liczbę procesorów i użyć jej jako opcji -j:

make -j `nproc` 
Powiązane problemy