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.



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ą).


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.


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.


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!)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.