W Gentoo Linux można ustawić MAKEOPTS
zmienną, /etc/portage/make.conf
aby informowała, make
ile zadań powinno działać równolegle podczas budowania pakietów. Ponieważ mam dwurdzeniowy procesor, naiwnie wybrałem -j2
opcję: jedno zadanie na rdzeń, więc oba mają coś do zrobienia. „Problem” polega na tym, że istnieje wiele odniesień, które mówią użytkownikom posiadającym dwurdzeniowy procesor, aby -j3
zamiast tego ustawić tę opcję. Niektórzy z nich są:
- Podręcznik Gentoo
- Wiki Gentoo
- strona man make.conf (5)
Na przykład podręcznik Gentoo mówi:
Dobrym wyborem jest liczba procesorów (lub rdzeni procesorów) w twoim systemie plus jeden, ale ta wskazówka nie zawsze jest idealna.
Ale jakie jest uzasadnienie reguły „Procesory + 1”? Dlaczego dodatkowa praca?
Strona podręcznika make.conf (5) mówi nawet:
Sugerowane ustawienia to między procesorami + 1 a 2 * procesorami + 1.
Przeczytałem również sekcję 5.4 (Wykonanie równoległe) na make
stronie informacyjnej i make
objaśnienie strony podręcznika dla -j
opcji, ale wygląda na to, że nie ma tam odpowiedzi.
Odpowiedzi:
Nie ma prostej reguły, która zawsze działa. Ludzie mogą polecić konkretną postać, ponieważ eksperymentowali z określoną kompilacją na konkretnej maszynie i było to najlepsze ustawienie lub dlatego, że kierowali się rozumowaniem, które może mieć związek z rzeczywistością lub nie.
Jeśli masz dużo pamięci RAM, to czynnikiem ograniczającym w długiej kompilacji będzie czas procesora. Zatem jedno zadanie na procesor plus jedno zadanie oczekujące dla tych okazjonalnych bloków we / wy jest dobrym ustawieniem. To sprawia, że jest
-j3
to dwurdzeniowy procesor (a ściślej mówiąc, w przypadku maszyny dwurdzeniowej - jeśli każdy rdzeń jest hiperwątkowany, będą to 4 procesory, więc-j5
).Jeśli masz bardzo mało pamięci RAM, czynnikiem ograniczającym może być to, że nie możesz mieć wielu równoczesnych zadań, w przeciwnym razie będą się nawzajem wymieniać. Na przykład, jeśli nie możesz wygodnie dopasować dwóch wystąpień kompilatora w pamięci,
make -j2
może być już wolniejszy niżmake
. Ponieważ zależy to od tego, ile procesów kompilatora można zmieścić w pamięci RAM jednocześnie, nie ma możliwości uzyskania ogólnej liczby.W międzyczasie korzystne może być posiadanie większej liczby miejsc pracy. Jeśli każdy proces kompilatora jest niewielki, ale kompilacja jako całość dotyka dużej ilości danych, wówczas dyskowe operacje we / wy mogą być czynnikiem blokującym. W takim przypadku będziesz potrzebować kilku zadań na procesor jednocześnie, aby zawsze było jedno zadanie na każdym procesorze, podczas gdy inne czekają na operacje we / wy. Ponownie, jest to bardzo zależne od zadania kompilacji i dostępnej pamięci RAM, tutaj od tego, co jest dostępne dla pamięci podręcznej danych (istnieje optymalizacja, po której zbyt wiele zadań zbyt mocno zanieczyszcza pamięć podręczną).
źródło
-j2
moim systemie. To dlatego, że próbowałem zarówno wschodzącychgcc
orazfirefox
z ustawieniami z-j1
przygotowań do-j5
(w sumie 10 wyłaniają poleceń) i wydaje się, że choć-j2
jest zdecydowanie szybszy niż-j1
trzy pozostałe ustawienia są na równi z-j2
.Sądzę, że jest to trochę heurystyczne - zezwolenie
make
na uruchomienieCPUs + 1
procesów polega na upewnieniu się, że:Ale znowu, to heurystyka, a podręcznik FreeBSD wciąż zaleca
make -j4
jeden procesor.źródło
Zasadniczo istnieją powody, aby rozpocząć więcej zadań niż liczba rdzeni. W przypadku kompilacji C przy użyciu gcc, jeśli -pipe nie jest zdefiniowany w opcjach gcc, wykonuje swoje działania (wstępne przetwarzanie, pierwsze uruchomienie, optymalizacje i asemblowanie) sekwencyjnie przy użyciu plików tymczasowych; -pipe zmienia to na używanie potoków między podprocesami. (Dodanie -pipe jest domyślne np. Dla FreeBSD, ale nie jest tradycyjne w Linuksie.) Jeśli więc masz 2 rdzenie i zezwalasz na 2 zadania równolegle, spędzą one trochę czasu na wejściu / wyjściu z dysku. Wydaje się, że zalecenie dodania 1 pracy jest związane z tą specyfiką. Ale aby uzyskać ostateczną odpowiedź, powinieneś dowiedzieć się, kto i kiedy dodał tę rekomendację i zapytać go :) lub zapytać na liście dyskusyjnej Gentoo devels.
źródło
Zasadniczo liczba ta jest tym, co autorzy nazywają zdrowym rozsądkiem. W najlepszym razie dobrze zgadnąć. O ile wiem proces tworzenia, który pojawia się podczas pisania,
make
jest już liczony, więc-j3
możesz skończyć z głównym procesem czekającym, podczas gdy dwa pozostałe są w trakcie kompilacji.Jednak kiedy korzystałem z Gentoo, była to ogólna zasada
<#cpus>*2 + 1
.Wszystko zależy od tego, co twoje ślady kurczaka, liście herbaty lub magiczna kula 8 mówią ci o dyskowym wejściu / wyjściu, które musi się odbyć i harmonogramie twojego obecnego jądra Linuksa. [rozpocznij rdzeń tego postu] Z mojego osobistego doświadczenia (
-j
nie jest specyficzne dla Gentoo) wszystko między #cpus + 1 a #cpus * 2 +1 daje dobre wyniki [zakończ rdzeń tego postu] i średnio prawie nie zauważysz żadnych różnic. Procesory i jądra są obecnie całkiem dobre.ALE wszystkie te zmiany, gdy: a) faktycznie używasz więcej niż jednego pola do kompilacji (du'h) lub b) opracowujesz swój własny kod
Wyższy
-j
atrybut częściej pokazuje nieznane wcześniej zależności.I na marginesie: nie przechodź przez liczbę rdzeni, ale przez liczbę równoczesnych strumieni pobieranych przez procesory. (Hypertheading!)
źródło