Dlaczego ludzie polecają opcję -j3 dla make, gdy mają dwurdzeniowy procesor?

18

W Gentoo Linux można ustawić MAKEOPTSzmienną, /etc/portage/make.confaby informowała, makeile zadań powinno działać równolegle podczas budowania pakietów. Ponieważ mam dwurdzeniowy procesor, naiwnie wybrałem -j2opcję: 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 -j3zamiast tego ustawić tę opcję. Niektórzy z nich są:

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 makestronie informacyjnej i makeobjaśnienie strony podręcznika dla -jopcji, ale wygląda na to, że nie ma tam odpowiedzi.

Francesco Turco
źródło

Odpowiedzi:

13

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 -j3to 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 -j2moż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ą).

Gilles „SO- przestań być zły”
źródło
Nie wiedziałem, że jeśli rdzenie procesora są hiperwątkowane, to każdy z nich liczy się jako dwa. W każdym razie wydaje się, że mój procesor nie obsługuje Hyper Threading.
Francesco Turco
Zaakceptowałem tę odpowiedź. W każdym razie postanowiłem pozostać przy -j2moim systemie. To dlatego, że próbowałem zarówno wschodzących gccoraz firefoxz ustawieniami z -j1przygotowań do -j5(w sumie 10 wyłaniają poleceń) i wydaje się, że choć -j2jest zdecydowanie szybszy niż -j1trzy pozostałe ustawienia są na równi z -j2.
Francesco Turco
7

Sądzę, że jest to trochę heurystyczne - zezwolenie makena uruchomienie CPUs + 1procesów polega na upewnieniu się, że:

  1. nie byłoby luki między procesem roboczym, który właśnie się zakończył, a robotnikiem jeszcze do uruchomienia - podobnie jak wstępnie wypełniająca kolejka uruchomień.
  2. nie byłoby zbyt wielu konkurencyjnych procesów, które spowodowałyby zauważalny narzut dzięki wstępnemu wypełnianiu kolejki uruchomieniowej.

Ale znowu, to heurystyka, a podręcznik FreeBSD wciąż zaleca make -j4 jeden procesor.

poige
źródło
5

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.

Netch
źródło
2

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, makejest już liczony, więc -j3moż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 ( -jnie 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 -jatrybut 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!)

Bananguin
źródło