In Gentoo Linux ist es möglich, die MAKEOPTS
Variable so einzustellen /etc/portage/make.conf
, dass angegeben wird, make
wie viele Jobs beim Erstellen von Paketen parallel ausgeführt werden sollen. Da ich eine Dual-Core-CPU habe, habe ich mich naiv für die -j2
Option entschieden: ein Job pro Core, damit beide etwas zu tun haben. Das "Problem" ist, dass es viele Referenzen gibt, die Benutzern mit einer Dual-Core-CPU sagen, dass sie die -j3
Option stattdessen einstellen sollen . Einige von ihnen sind:
- Gentoo Handbuch
- Gentoo Wiki
- make.conf (5) man page
Zum Beispiel heißt es im Gentoo Handbuch:
Eine gute Wahl ist die Anzahl der CPUs (oder CPU-Kerne) in Ihrem System plus eine, aber diese Richtlinie ist nicht immer perfekt.
Aber was ist die Begründung für die Regel "CPUs + 1"? Warum der Nebenjob?
Die Manpage make.conf (5) sagt sogar:
Empfohlene Einstellungen liegen zwischen CPUs + 1 und 2 * CPUs + 1.
Ich habe auch Abschnitt 5.4 (Parallele Ausführung) auf der make
Infoseite und in der Manpage make
zur -j
Option gelesen , aber es scheint, als gäbe es dort keine Antworten.
Antworten:
Es gibt keine einfache Regel, die immer funktioniert. Die Leute empfehlen möglicherweise eine bestimmte Figur, weil sie mit einer bestimmten Zusammenstellung auf einer bestimmten Maschine experimentiert haben und dies die beste Einstellung war, oder weil sie einer Überlegung gefolgt sind, die möglicherweise in irgendeiner Beziehung zur Realität steht oder nicht.
Wenn Sie mit viel RAM gesegnet sind, ist der begrenzende Faktor für eine lange Kompilierung die CPU-Zeit. Dann ist eine Task pro CPU plus eine anstehende Task für diese gelegentlichen E / A-Blöcke eine gute Einstellung. Das macht es
-j3
für eine Dual-Core-CPU (oder genauer gesagt für eine Dual-CPU-Maschine - wenn jeder Kern über ein Hyperthread verfügt, sind das also 4 CPUs-j5
).Wenn Sie nur über sehr wenig RAM verfügen, kann dies ein begrenzender Faktor sein, dass nicht viele Jobs gleichzeitig ausgeführt werden können. Andernfalls werden die Jobs weiterhin gegeneinander ausgetauscht. Wenn Sie beispielsweise zwei Compiler-Instanzen nicht bequem in den Speicher einfügen können, ist dies
make -j2
möglicherweise bereits langsamer alsmake
. Da dies davon abhängt, wie viele Compiler-Prozesse gleichzeitig in den Arbeitsspeicher passen, ist es nicht möglich, eine allgemeine Zahl abzuleiten.Zwischendurch kann es vorteilhaft sein, mehr Arbeitsplätze zu haben. Wenn jeder Compiler-Prozess klein ist, der Build jedoch insgesamt viele Daten berührt, ist die Festplatten-E / A möglicherweise der blockierende Faktor. In diesem Fall möchten Sie mehrere Jobs pro CPU gleichzeitig ausführen, sodass für jede CPU immer ein Job verwendet wird, während andere auf die E / A warten. Dies ist wiederum sehr abhängig vom Build-Job und vom verfügbaren RAM, hier davon, was für den Daten-Cache verfügbar ist (es gibt ein Optimum, nach dem zu viele Jobs den Cache zu sehr verschmutzen).
quelle
-j2
an meinem System festzuhalten. Dies liegt daran, dass ich versucht habe, beidegcc
undfirefox
mit Einstellungen von-j1
bis zu-j5
(für insgesamt 10 emerge-Befehle) aufzutauchen, und es scheint, dass die anderen drei Einstellungen-j2
definitiv schneller sind als .-j1
-j2
Ich denke , das irgendwie ist Heuristik - ermöglicht
make
zu StartCPUs + 1
Prozesse , um sicherzustellen, dass:Aber auch das ist heuristisch und das FreeBSD-Handbuch empfiehlt immer noch
make -j4
für eine einzelne CPU.quelle
Im Allgemeinen gibt es Gründe, mehr Jobs als die Anzahl der Kerne zu starten. Wenn beim C-Kompilieren mit gcc -pipe nicht in den gcc-Optionen definiert ist, werden die Aktionen (Vorverarbeitung, erste Ausführung, Optimierungen und Assemblierung) nacheinander unter Verwendung temporärer Dateien ausgeführt. -pipe ändert dies dahingehend, dass Pipes zwischen Unterprozessen verwendet werden. (Das Hinzufügen von -pipe ist Standard, z. B. für FreeBSD, aber unter Linux nicht traditionell.) Wenn Sie also 2 Kerne haben und 2 Jobs gleichzeitig zulassen, verbringen Sie einige Zeit mit Festplatten-E / A. Die Empfehlung, 1 Job hinzuzufügen, scheint mit diesen Besonderheiten in Zusammenhang zu stehen. Aber um die endgültige Antwort zu erhalten, sollten Sie herausfinden, wer und wann diese Empfehlung hinzugefügt hat und ihn fragen :) oder in der Mailingliste von Gentoo Devels nachfragen.
quelle
Im Grunde ist diese Zahl das, was die Autoren den gesunden Menschenverstand nennen. Bestenfalls ist es eine gute Vermutung. Soweit ich weiß, wird der make-Prozess, der beim Tippen ausgelöst
make
wird, bereits gezählt, sodass-j3
Sie am Ende den Hauptprozess warten müssen, während die beiden anderen kompilieren.Als ich Gentoo benutzte, galt jedoch die Faustregel
<#cpus>*2 + 1
.Es hängt alles davon ab, was Ihre Hühnchen-Trails, Teeblätter oder Magic 8-Bälle über die Festplatten-E / A, die stattfinden muss, und die Planung Ihres aktuellen Linux-Kernels aussagen. [Kern dieses
-j
Posts beginnen] Aus meiner persönlichen Erfahrung ( ist nicht Gentoo-spezifisch) ergibt alles zwischen #cpus + 1 und #cpus * 2 +1 gute Ergebnisse [Kern dieses Posts beenden] und im Durchschnitt werden Sie kaum Unterschiede feststellen. Prozessoren und Kernel sind heutzutage ziemlich gut.ABER all dies ändert sich, wenn: a) Sie tatsächlich mehr als eine Box zum Kompilieren verwenden (du'h) oder b) Ihren eigenen Code entwickeln
Ein höheres
-j
Attribut weist mit größerer Wahrscheinlichkeit zuvor unbekannte Abhängigkeiten auf.Und noch eine Randnotiz: Gehen Sie nicht nach der Anzahl der Kerne, sondern nach der Anzahl der gleichzeitigen Streams, die die CPUs nehmen. (Überschrift!)
quelle