Hier ist eine kleine Illustration meiner Frage:
Nehmen Sie einen Build-Job an, der aus 4 unabhängigen Tasks mit dem Namen AD besteht. D dauert länger als AC.
Ein Build-System, das die relativen Task-Zeiten nicht berücksichtigen kann, plant die Tasks möglicherweise folgendermaßen:
---------------------------------------
CPU1: A | C |
---------------------------------------
CPU2: B | D |
---------------------------------------
Wenn der Scheduler hingegen die Zeitunterschiede der Aufgabe kennt, könnte er sich diesen viel kürzeren Zeitplan einfallen lassen:
---------------------------------------
CPU1: A | B | C |
---------------------------------------
CPU2: D |
---------------------------------------
Meine Fragen:
- Gibt es Buildsysteme, die die relativ zu erwartenden Taskzeiten in den Zeitplan einbeziehen?
- Welche akademische Forschung zu solchen Buildsystemen gibt es?
- Woher beziehen diese Build-Systeme (falls vorhanden) die Zeitinformationen? Heuristiken, Timings aus früheren Builds?
- Wenn solche Build-Systeme nicht existieren, warum? Gibt es eine GOTCHA, die sie weniger wert macht, als sie auf den ersten Blick erscheinen?
scheduling
research
build-system
sjakobi
quelle
quelle
Antworten:
Microsoft Visual Studio Team System (ehemals TFS) berücksichtigt Build-Aktionszeiten und parallele Builds. Es übernimmt die Daten aus dem vorherigen Build-Verlauf. und obwohl ich nicht glaube, dass Sie das gewünschte Verhalten sofort erreichen können, können Sie es möglicherweise anpassen.
Ein Beispiel für einige benutzerdefinierte Aufgaben zur Optimierung der Leistung
https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/
quelle
Dies basiert auf der falschen Annahme, dass das "Erstellen" einer Aufgabe nicht parallel ist.
Viele Compiler arbeiten mit mehreren Threads, sodass eine einzelne Task A alle CPUs verwendet. Daher spielt die Reihenfolge keine Rolle. Bei E / A-gebundenen Aufgaben, insbesondere bei Netzwerkaufgaben, sollten Sie diese auch parallel starten: Die meiste Zeit wird darauf verwendet, auf eine Antwort zu warten.
Mit anderen Worten, die Reihenfolge spielt keine Rolle, da die einzelnen Aufgaben typischerweise parallelisiert werden (wie zum Beispiel das Kompilieren).
Bearbeiten:
Tatsächlich ist auch diese Konzeption von "Task A auf CPU 1" fehlerhaft. Selbst für Single-Thread-Aufgaben kann das Betriebssystem, das die Prozesse / Threads plant, bei jedem Kontextwechsel von CPU zu CPU springen. Ich vermute, die meisten Build-Systeme führen alle Aufgaben nur parallel aus und lassen das Betriebssystem die Zeitplanung durchführen. Längere Aufgaben werden länger dauern und das wars auch schon.
Angenommen, Sie haben eine Single-Thread-Task mit langer Laufzeit, die nicht an E / A gebunden ist , ist es für das Build-System viel einfacher, eine Priorität / Wichtigkeit zuzuweisen, als zu versuchen, kleinere Tasks zu verzögern, um Kontextwechsel vom Betriebssystem zu reduzieren.
Selbst wenn Sie solch seltsame Aufgaben haben, die in der Praxis recht selten sind, und ein ausgefallenes Planungssystem haben, das auf Heuristiken basiert, die auf früheren Läufen basieren (die einzige Möglichkeit, dies zu wissen), sind die Vorteile, die Sie daraus ziehen, möglicherweise eher gering. .jedoch Sie erhalten eine Reihe von zusätzlichen Komplexität zu pflegen.
quelle
make -j
) kann mehrere Kompilierungsprozesse gleichzeitig starten.-j <nb-cores>
aber leider ist die Standardeinstellung immer noch "1" ... Ich bin immer noch überrascht, dass es sich nie geändert hat.