Es scheint einige Kontroversen darüber zu geben, ob die Anzahl der Jobs in GNU make der Anzahl der Kerne entsprechen soll oder ob Sie die Erstellungszeit optimieren können, indem Sie einen zusätzlichen Job hinzufügen, der in die Warteschlange gestellt werden kann, während die anderen "arbeiten". .
Ist es besser zu nutzen -j4
oder -j5
ein Quad - Core - System auf?
Haben Sie ein Benchmarking gesehen (oder durchgeführt), das das eine oder andere unterstützt?
make `nproc`
, um CPU-unabhängiges Skript zu machen :)Antworten:
Ich würde sagen, das Beste, was Sie tun können, ist, es selbst an Ihrer speziellen Umgebung und Arbeitsbelastung zu messen. Es scheint, dass es zu viele Variablen gibt (Größe / Anzahl der Quelldateien, verfügbarer Speicher, Festplatten-Caching, ob sich Ihr Quellverzeichnis und Ihre Systemheader auf verschiedenen Festplatten befinden usw.), um eine einheitliche Antwort zu erhalten.
Meine persönliche Erfahrung (auf einem 2-Core-MacBook Pro) ist, dass -j2 deutlich schneller als -j1 ist, aber darüber hinaus (-j3, -j4 usw.) gibt es keine messbare Beschleunigung. Für meine Umgebung scheint "jobs == Anzahl der Kerne" eine gute Antwort zu sein. (YMMV)
quelle
Ich habe mein Heimprojekt auf meinem 4-Core mit Hyperthreading-Laptop ausgeführt und die Ergebnisse aufgezeichnet. Dies ist ein ziemlich compilerlastiges Projekt, das jedoch einen Unit-Test von 17,7 Sekunden am Ende beinhaltet. Die Kompilierungen sind nicht sehr E / A-intensiv; Es ist sehr viel Speicher verfügbar, und wenn nicht, befindet sich der Rest auf einer schnellen SSD.
Grundlegende Ergebnisse:
Meine Vermutung im Moment: Wenn Sie etwas anderes auf Ihrem Computer tun, verwenden Sie die Kernanzahl. Wenn Sie dies nicht tun, verwenden Sie die Thread-Anzahl. Ein Überschreiten zeigt keinen Nutzen. Irgendwann werden sie speicherbeschränkt und kollabieren dadurch, was das Kompilieren viel langsamer macht. Die "inf" -Linie wurde zu einem viel späteren Zeitpunkt hinzugefügt, was mir den Verdacht gab, dass es für die 8+ Jobs eine thermische Drosselung gab. Dies zeigt, dass für diese Projektgröße keine Speicher- oder Durchsatzbeschränkung gilt. Es ist jedoch ein kleines Projekt, da 8 GB Speicher zum Kompilieren vorhanden sind.
quelle
Ich persönlich verwende,
make -j n
wobei n "Anzahl der Kerne" + 1 ist.Ich kann jedoch keine wissenschaftliche Erklärung abgeben: Ich habe viele Leute gesehen, die dieselben Einstellungen verwendeten, und sie haben mir bisher ziemlich gute Ergebnisse geliefert.
Auf jeden Fall müssen Sie vorsichtig sein, da einige Make-Chains einfach nicht mit der
--jobs
Option kompatibel sind und zu unerwarteten Ergebnissen führen können. Wenn Sie seltsame Abhängigkeitsfehler haben, versuchen Sie es einfachmake
ohne--jobs
.quelle
Letztendlich müssen Sie einige Benchmarks durchführen, um die beste Anzahl für Ihren Build zu ermitteln. Denken Sie jedoch daran, dass nicht nur die CPU von Bedeutung ist!
Wenn Sie beispielsweise einen Build haben, der stark von der Festplatte abhängt, ist das Laichen vieler Jobs auf einem Multicore-System möglicherweise langsamer , da die Festplatte zusätzliche Arbeit leisten muss, um den Festplattenkopf hin und her zu bewegen, um alle zu bedienen die verschiedenen Jobs (abhängig von vielen Faktoren, wie z. B. wie gut das Betriebssystem mit dem Festplatten-Cache umgeht, Unterstützung für native Befehlswarteschlangen durch die Festplatte usw.).
Und dann haben Sie "echte" Kerne im Vergleich zu Hyper-Threading. Sie können von Spawning-Jobs für jeden Hyper-Thread profitieren oder nicht. Auch hier müssen Sie einen Benchmark durchführen, um dies herauszufinden.
Ich kann nicht sagen, dass ich #cores + 1 speziell ausprobiert habe , aber auf unseren Systemen (Intel i7 940, 4 Hyperthread-Kerne, viel RAM und VelociRaptor-Laufwerke) und unserem Build (groß angelegter C ++ - Build, der abwechselnd CPU und ich ist / O gebunden) gibt es sehr wenig Unterschied zwischen -j4 und -j8. (Es ist vielleicht 15% besser ... aber bei weitem nicht doppelt so gut.)
Wenn ich zum Mittagessen weggehe, verwende ich -j8, aber wenn ich mein System für etwas anderes verwenden möchte, während es erstellt wird, verwende ich eine niedrigere Zahl. :) :)
quelle
-j 8
Ich habe gerade einen Athlon II X2 Regor Proc mit einem Foxconn M / B und 4 GB G-Skill-Speicher erhalten.
Ich setze meine 'cat / proc / cpuinfo' und 'free' am Ende, damit andere meine Spezifikationen sehen können. Es ist ein Dual-Core-Athlon II x2 mit 4 GB RAM.
Ich habe die Kernelquelle des nächsten Schritts (Linux-3.2.46) auf / archive4 heruntergeladen.
extrahierte es (
tar -xjvf linux-3.2.46.tar.bz2
);cd'd in das Verzeichnis (
cd linux-3.2.46
);und kopierte die Konfiguration des Standardkernels über (
cp /usr/src/linux/.config .
);wird verwendet
make oldconfig
, um die 3.2.46-Kernelkonfiguration vorzubereiten;dann lief make mit verschiedenen Beschwörungen von -jX.
Ich habe die Timings jedes Laufs getestet, indem ich make nach dem Befehl time ausgegeben habe, z. B. 'time make -j2'. Zwischen jedem Lauf habe ich den Linux-3.2.46-Baum 'rm -rf' erstellt und erneut extrahiert, die Standardeinstellung /usr/src/linux/.config in das Verzeichnis kopiert, make oldconfig ausgeführt und dann meinen 'make -jX'-Test erneut durchgeführt .
einfach "machen":
wie oben, aber mit make -j2
wie oben, aber mit make -j3
wie oben, aber mit make -j4
wie oben, aber mit make -j8
'cat / proc / cpuinfo' ergibt:
"freie" Erträge:
quelle
make -j
auf diesem System? Make soll die Last überprüfen und die Anzahl der Prozesse basierend auf der Last skalieren.make -j
begrenzt die Anzahl der Jobs überhaupt nicht. Dies ist bei einem mittelgroßen oder großen Projekt normalerweise katastrophal, da schnell mehr Jobs gegabelt werden, als vom RAM unterstützt werden können. Die Option, die Sie durch Last einschränken müssen, ist-l [load]
in Verbindung mit-j
Beides ist nicht falsch. Um mit sich selbst und dem Autor der Software, die Sie kompilieren, in Frieden zu sein (auf Softwareebene selbst gelten verschiedene Einschränkungen für mehrere Threads / Single-Threads), empfehle ich Folgendes:
Hinweise:
nproc
ist ein Linux-Befehl, der die Anzahl der auf dem System verfügbaren Kerne / Threads (moderne CPU) zurückgibt. Wenn Sie es wie oben unter Häkchen setzen, wird die Nummer an den Befehl make übergeben.Zusätzliche Informationen: Wie bereits erwähnt, kann die Verwendung aller Kerne / Threads zum Kompilieren von Software Ihre Box buchstäblich fast zum Erliegen bringen (da sie nicht reagiert) und möglicherweise sogar länger dauern als die Verwendung weniger Kerne. Wie ich hier gesehen habe, hatte ein Slackware-Benutzer eine Dual-Core-CPU, lieferte aber immer noch Tests bis zu j 8, die bei j 2 nicht mehr anders waren (nur 2 Hardware-Kerne, die die CPU verwenden kann). Um zu vermeiden, dass die Box nicht reagiert, schlage ich vor, dass Sie sie wie folgt ausführen:
Dadurch wird die Ausgabe von
nproc
an übergebenmake
und 2 Kerne von ihrem Ergebnis subtrahiert.quelle
Nur als Ref:
Aus dem
Spawning Multiple Build Jobs
Abschnitt in LKD :quelle
Aus meiner Erfahrung muss es einige Leistungsvorteile geben, wenn zusätzliche Jobs hinzugefügt werden. Dies liegt einfach daran, dass die Festplatten-E / A neben der CPU einer der Engpässe ist. Es ist jedoch nicht einfach, die Anzahl der zusätzlichen Jobs zu bestimmen, da diese stark mit der Anzahl der Kerne und Typen der verwendeten Festplatte verbunden sind.
quelle
Viele Jahre später sind die meisten dieser Antworten immer noch richtig. Es hat sich jedoch ein wenig geändert: Wenn Sie mehr Jobs als physische Kerne verwenden, wird dies jetzt erheblich beschleunigt. Als Ergänzung zu Dascandys Tabelle sind hier meine Zeiten für das Kompilieren eines Projekts auf einem AMD Ryzen 5 3600X unter Linux. (The Powder Toy, Commit c6f653ac3cef03acfbc44e8f29f11e1b301f1ca2)
Ich empfehle, sich selbst zu überprüfen, aber ich habe mit Beiträgen anderer festgestellt, dass die Verwendung Ihrer logischen Kernanzahl für die Jobanzahl unter Zen gut funktioniert. Daneben scheint das System nicht an Reaktionsfähigkeit zu verlieren. Ich kann mir vorstellen, dass dies auch für neuere Intel-CPUs gilt. Beachten Sie, dass ich auch eine SSD habe, sodass es sich möglicherweise lohnt, Ihre CPU selbst zu testen.
Tests unter Ubuntu 19.10 mit Ryzen 5 3600X, Samsung 860 Evo SSD (SATA) und 32 GB RAM
Schlussbemerkung: Andere Leute mit einem 3600X haben möglicherweise bessere Zeiten als ich. Bei diesem Test war der Eco-Modus aktiviert, wodurch die Geschwindigkeit der CPU etwas verringert wurde.
quelle
JA! Auf meinem 3950x starte ich -j32 und es spart Stunden Kompilierungszeit! Ich kann während des Kompilierens ohne Unterschied immer noch YouTube ansehen, im Internet surfen usw. Der Prozessor ist auch bei einem 1 TB 970 PRO nvme oder 1 TB Auros Gen4 nvme und 64 GB 3200C14 nicht immer gebunden. Selbst wenn es so ist, bemerke ich die Benutzeroberfläche nicht. Ich plane, in naher Zukunft einige große anstehende Projekte mit -j48 zu testen. Ich erwarte, wie Sie wahrscheinlich tun, eine beeindruckende Verbesserung. Diejenigen, die noch einen Quad-Core haben, erhalten möglicherweise nicht die gleichen Gewinne ...
Linus selbst hat gerade ein Upgrade auf ein 3970x durchgeführt und Sie können Ihren unteren Dollar wetten, er läuft mindestens -j64.
quelle