Paralleles Kompilieren mit GCC/Clang



  • Ich beschäftige mich in der letzten Zeit damit, das Kompilieren zu beschleunigen und spiele daher mit diversen Möglichkeiten herum.

    Ich habe einen i7-860 (8 Threads) mit 16GB 1333er RAM und einer SATA-SSD, sowie einen Xeon E5620 (8 Threads) mit 8GB 1066er RAM und SATA-SSD.
    Die Xeon-CPU ist Benchmarks zufolge 10% langsamer, das RAM ist langsamer und so ist der i7 erwartungsgemäß beim Kompilieren etwa 20% schneller als der Xeon.
    Der erste Versuch startete mit distcc und so i7 und Xeon gleichzeitig kompilieren zu lassen. Das funktioniert soweit auch sehr hübsch, macht das kompilieren mit beiden Rechnern aber 20% langsamer als den i7 alleine. Ich erreiche mit distcc die gleichen Kompilierzeiten wie mit dem Xeon alleine (1Gbit-Netzwerk). Das überzeugt also nicht wirklich.

    Neues Experiment: Weitere E5620 CPU gekauft, ein wenig gegooglet und mir Statistiken zu DualChannel angeguckt: wird wohl überschätzt. Also die 2x4GB auf die beiden CPUs verteilt, nun werkeln hier 2 Xeons (16 Threads) gegen den Quelltext und sind damit etwa 10% schneller als der i7. Die theoretische Verdopplung der Rechenleistung bringt also einen Geschwindkeitsvorteil von 25%.
    Bezogen auf die Preise moderner Xeon-CPUs also sehr/zu teuer.

    16 Threads laufen laut htop (sehr selten) auch mal gleichzeitig auf 100%, aber der Rechner verbringt auch viel Zeit mit Däumchen drehen. Die SSD ist allerdings schon (minimal) schneller als das Hardware-RAID (und auch nur da drin, um genau das zu testen, bringt keine 5%).

    Weder möchte ich hier einen Cluster aufbauen, zumal distcc jetzt auch nicht auf Anhieb überzeugte.

    Ich möchte das Kompilieren "nur" deutlich beschleunigen. Neue Hardware steht also an. Ich möchte aber keine sinnlose neue Hardware kaufen, weswegen ich hier experimentiere.

    Nun zur eigentlichen Frage: Gibt es in dem Bereich hier bereits Erfahrungen? Ich habe distcc ans Laufen gebracht, aber mich nicht zum distcc-Experten gemacht. Lohnt es sich weiter zu feilen, dass da eine bemerkenswerte(!) Beschleunigung machbar wird (also ist "mal eben distcc einrichten, dass es läuft" nur die halbe Miete?) oder braucht man für distcc eher etwas Clusterartiges? Hat jemand distcc Erfahrungenswerte?

    Gibt es Erfahrungen mit alternativen Lösungen?
    Gibt es Tipps zur Beschaffung von Hardware, die optimal auf die Bedürfnisse von Compilern zugeschnitten ist? Tipps im Idealfall durch Expertise und nicht durch Bauchgefühl. 😉
    Schafft eine PCI-SSD bessere Performance, da es hier ja weniger darum geht große Datenmengen zu transferieren als um schnelle Zugriffszeiten. Ich habe keine, will aber auch keine kaufen nur um zu sehen, dass sie beim kompilieren genauso schnell wie eine SATA-SSD ist.

    Beim Kompilieren mit 16 Threads steht sich der Rechner offenbar deutlich selbst im Weg. Skaliert verteilte Kompilierung besser als teuer aufgerüstete Server? Nutzt ja nix, wenn sich zwei Octacores gegenseitig die Butter vom Brot nehmen.

    Verteiltes kompilieren auf Desktops wäre aber so oder so eine hübsche Lösung. Hier steht z.B. auch ein NAS, die halt tut, was eine NAS tun muss (meistens nix) und deren Quadcore man ja nebenher auch mit vier Threads beschäftigen könnte.
    Mein Compiler-Utopia: Wenn alle Rechner als Kompilierhilfe zur Verfügung stehen, hilft jeder jedem und die meisten Zeit kompiliert schließlich sowieso keiner.

    Gibt es dazu bereits Lösungen? Hat jemand z.B. sich diesbezüglich mit Bash-Skripten beholfen (was mein gegenwärtiges Experiment darstellt, um die Verluste über das Netzwerk zu minimieren).

    Ansonsten bin ich auch für andere Ideen offen. 🙂



  • Ein Ansatz: IncrediBuild

    Wir haben damit gute Erfahrungen gemacht, ist allerdings schon eine Weile her.


Anmelden zum Antworten