Bereits heute Morgen , als etwas zu bauen, entschied ich mich zu laufen make
als
$ make -j
Möglicherweise aus Gewohnheit mit anderen Programmen, z. B. cabal
wenn die -j
Standardeinstellungen auf eine angemessene Grenze festgelegt sind.
Ungefähr 20 Sekunden später kommt mein gesamter Desktop zum Stillstand . Ich suche nach verschiedenen Anzeichen von Aktivität. Keine Fans drehen sich. Die Festplattenanzeige leuchtet durchgehend grün, aber ich höre keine Festplattenaktivität. Hmmmmm. Nach 10 Minuten Stille sehe ich endlich eine Antwort auf den ersten Tastendruck, den ich vor langer Zeit gemacht habe, und ich höre auch das allzu vertraute Geräusch von Disk-Thrashing. 20 Minuten später, als ich langsam versuchte, mich auf dieser nicht reagierenden Maschine in ein Terminal zu waten, gab ich nach und benutzte REISUB.
Zuerst dachte ich, dass eine nicht verwandte Desktop-Anwendung der Schuldige gewesen sein muss, weil ich längst Speicherbeschränkungen für interaktive Bash-Sitzungen festgelegt habe , um zu verhindern, dass ich mich in genau diese Situation versetze! Aber /var/log/syslog
erzählt eine andere Geschichte; die OOM Killer hinter sich gelassen einigen ps
Deponien , die verdächtig sind , verpackt mit c++
und cc1plus
Prozesse!
Hier ist eine Frequenzanalyse eines dieser Dumps:
Command Number of appearances
'sh' 322
'c++' 321
'cc1plus' 321
'chrome' 27
'make' 27
'bash' 3
all else combined 120
Also überprüfe ich die Manpage für GNU make: (Hervorhebung hinzugefügt)
-j [Jobs], --jobs [= Jobs] Gibt die Anzahl der Jobs (Befehle) an, die gleichzeitig ausgeführt werden sollen. Wenn es mehr als eine -j-Option gibt, ist die letzte wirksam. Wenn die Option -j ohne Argument angegeben wird, wird durch make die Anzahl der Jobs, die gleichzeitig ausgeführt werden können, nicht begrenzt.
Ich bin nur ungern zu sehen , ob ich das Problem reproduzieren kann (Doktor, es tut weh , wenn ich dies ...) , aber die Ergebnisse der Untersuchung scheinen bisher ein zu Hause weggelaufen zu sein: Klar, make -j
und die Hunderte von resultierenden Prozessen müssen war die Ursache für den Hang und das Disk Thrashing. Trotzdem kann ich beim Durchsuchen des Internets nicht viel Warnung davor finden. Springe ich zu Schlussfolgerungen?
Ist make -j
so gefährlich, wie es mir scheint? Wenn ja, warum um alles in der Welt ist es dort und was kann getan werden, um es idiotensicher zu machen?
quelle
alias make="make -j4"
die zu beseitigen Notwendigkeit für das Hinzufügen von-jN
Argumenten, aber ich habe noch nicht zu Ende gedacht , alle möglichen Folgen ...make
eigenen Einrichtungen und tun Sie diesexport MAKEFLAGS="-j 4"
. Für weitere Untersuchungen empfehle ich das Lesen vor dem Tippen . PS: <Anzahl der Kerne> + 2 hat mir seit fast zwei Jahrzehnten gute Dienste geleistet. Früher hat Linus ein Finale absolviert, bevor er einen Kernel veröffentlicht hat.make -j128
Antworten:
Es gibt Werkzeuge, mit denen Sie sich auf viele einfallsreiche Arten in den Fuß schießen können. Auf diese Weise können Sie Ihre Fantasie einsetzen, um Probleme zu lösen, ohne durch das eingeschränkt zu werden, was jemand anderes für "gesund" hält.
Laufen
make -j
auf einem kleinen Projekt ist durchaus sinnvoll . In anderen Projekten kann die Verwendung-j
ohne Argument die Reaktionsfähigkeit des Systems ernsthaft beeinträchtigen. In einigen Projekten-j2
wird der Build durch die Verwendung paralleler Builds sogar mit vollständig unterbrochen (Dateien, die durch einen parallelen Erstellungsprozess erstellt wurden, sind nicht rechtzeitig für einen anderen vorhanden usw.).Ich persönlich würde vermeiden Aliasing
make
zumake -j4
(wie Sie sagen , Sie erwägen, in den Kommentaren). Ich finde es besser, der Maschine explizit mitzuteilen, was zu tun ist, damit ich weiß, was sie tun wird. In ein paar Tagen werde ich diesen Alias vergessen haben und mich fragen, warum die vier Projekte, die ich in separaten Terminals baue, mein System nicht mehr reagieren lassen.Was "gefährlich" betrifft ... Das Wort bedeutet verschiedene Dinge in verschiedenen Kontexten. Ja, es ist "gefährlich", da das System dadurch möglicherweise nicht mehr reagiert. Ja, es ist "gefährlich", da es den Build-Prozess zur Hälfte des Builds zum Absturz bringen kann. Aber nein, es ist nicht "gefährlich" in dem Sinne, dass es Ihre Festplatte neu formatiert oder zufällige Dateien löscht.
Also, wie kann man es idiotensicher machen?
Hier ist eine todsichere Schritt-für-Schritt-Anleitung:
Beachten Sie auch, dass das
-j
Flag auf BSDmake
ist ein Argument erforderlich ist , und dass dieser Flag Nicht-Standard (der Unix - POSIX - Standard es nicht erwähnt).quelle
Sie können make auch einschränken mit
-l
:Beachten Sie jedoch, dass es nicht hilfreich zu sein scheint, es so auszuführen :
make -j -l4
.Zu viele Jobs werden gestartet, bevor der Lastdurchschnitt über das Limit steigt (basierend auf meiner Erfahrung). Somit kann eine Kombination funktionieren, z
make -j8 -l4
.quelle