GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man die maximale Anzahl bestimmen, die übergeben werden muss, um die Option -j zu erstellen?

nproc gibt die Anzahl der verfügbaren CPU-Kerne/-Threads an, z. B. 8 auf einer Quad-Core-CPU, die bidirektionales SMT unterstützt.

Die Anzahl der Jobs, die Sie mit make parallel ausführen können mit -j Option hängt von mehreren Faktoren ab:

  • die Menge an verfügbarem Speicher
  • die Speichermenge, die von jedem make verwendet wird Arbeit
  • inwieweit make Jobs sind E/A- oder CPU-gebunden

make -j$(nproc) ist ein anständiger Ausgangspunkt, aber Sie können normalerweise höhere Werte verwenden, solange Sie Ihren verfügbaren Speicher nicht erschöpfen und anfangen zu prügeln.

Für wirklich schnelle Builds empfehle ich, wenn Sie über genügend Speicher verfügen, die Verwendung eines tmpfs , auf diese Weise sind die meisten Jobs CPU-gebunden und make -j$(nproc) wird so schnell wie möglich funktionieren.


Der einfachste Weg ist die Verwendung von nproc etwa so:

make -j`nproc`

Der Befehl nproc gibt die Anzahl der Kerne auf Ihrem Computer zurück. Indem Sie es in die Häkchen packen, wird der nproc Der Befehl wird zuerst ausgeführt, gibt eine Zahl zurück und diese Zahl wird an make übergeben .

Möglicherweise haben Sie einige anekdotische Erfahrungen gemacht, bei denen das Ausführen von Core-Count + 1 zu schnelleren Kompilierungszeiten führt. Dies hat mehr mit Faktoren wie E/A-Verzögerungen, anderen Ressourcenverzögerungen und anderen Einschränkungen der Verfügbarkeit von Ressourcen zu tun.

Dazu mit nproc+1 , versuchen Sie Folgendes:

make -j$((`nproc`+1))

Leider können sogar verschiedene Teile desselben Builds mit widersprüchlichen Werten für den j-Faktor optimal sein, je nachdem, was gebaut wird, wie, welche der Systemressourcen zu diesem Zeitpunkt der Engpass sind, was sonst noch auf der Build-Maschine passiert, was darin vor sich geht das Netzwerk (wenn verteilte Build-Techniken verwendet werden), Status/Standort/Leistung der vielen Caching-Systeme, die an einem Build beteiligt sind, etc.

Das Kompilieren von 100 winzigen C-Dateien kann schneller sein als das Kompilieren einer einzigen riesigen oder umgekehrt. Das Erstellen von kleinem, stark verschachteltem Code kann langsamer sein als das Erstellen großer Mengen von einfachem/linearem Code.

Sogar der Kontext des Builds spielt eine Rolle - die Verwendung eines für Builds auf dedizierten Servern optimierten j-Faktors, der auf exklusive, nicht überlappende Builds abgestimmt ist, kann zu sehr enttäuschenden Ergebnissen führen, wenn er von Entwicklern verwendet wird, die parallel auf demselben gemeinsam genutzten Server bauen (jeder dieser Builds kann länger dauern Zeit als alle zusammen, wenn sie serialisiert sind) oder auf Servern mit unterschiedlichen Hardwarekonfigurationen oder virtualisiert.

Hinzu kommt der Aspekt der Korrektheit der Build-Spezifikation. Bei sehr komplexen Builds können Race-Conditions auftreten, die zeitweilige Build-Fehler mit Auftretensraten verursachen, die je nach Erhöhung oder Verringerung des j-Faktors stark variieren können.

Ich kann weitermachen. Der Punkt ist, dass Sie Ihre tatsächlich bewerten müssen in Ihren Kontext einbauen für die der j-Faktor optimiert werden soll. Der Kommentar von @ Jeff Schaller gilt:Iterieren Sie, bis Sie Ihre beste Anpassung gefunden haben. Persönlich würde ich mit dem nproc-Wert beginnen, zuerst nach oben und nach unten nur versuchen, wenn die Aufwärtsversuche eine sofortige Verschlechterung zeigen.

Es könnte eine gute Idee sein, zuerst mehrere identische Builds in vermeintlich identischen Kontexten zu messen, nur um eine Vorstellung von der Variabilität Ihrer Messungen zu bekommen - wenn sie zu hoch ist, könnte dies Ihren gesamten Optimierungsaufwand gefährden (eine 20%ige Variabilität würde eine 10%ige Verbesserung vollständig in den Schatten stellen/ Degradationsablesung in der j-Faktor-Suche).

Schließlich ist es meiner Meinung nach besser, einen (adaptiven) Jobserver zu verwenden, wenn er unterstützt und verfügbar ist, anstelle eines festen j-Faktors - er bietet durchgängig eine bessere Build-Leistung in einem breiteren Spektrum von Kontexten.


Linux
  1. Wie erhöht man die Anzahl der Inodes in einem Ext4-Dateisystem?

  2. Linux – Wie kann man feststellen, welches Modul den Kernel verschmutzt?

  3. Wie lässt man Gpg-Agent die Passphrase automatisch vergessen?

  4. Wie kann man Ubuntu sperren lassen?

  5. Wie erhalte ich die Anzahl der CPUs in Linux mit C?

So finden Sie die Portnummer eines Dienstes in Linux

So erhalten Sie die Anzahl der Prozessoren / Kerne in Linux

Wie finde ich die Anzahl der im Terminal verfügbaren vertikalen Linien?

Wie erstelle ich ein grafisches Diagramm einer Folge von Zahlen aus der Standardeingabe?

Wie ändere ich die maximale Anzahl von POP3-Verbindungen in WHM/cPanel?

Wie soll ich die aktuelle Netzwerkauslastung ermitteln?