Ist `make -j` (ohne Argument) gefährlich? [geschlossen]

13

Bereits heute Morgen , als etwas zu bauen, entschied ich mich zu laufen makeals

$ make -j

Möglicherweise aus Gewohnheit mit anderen Programmen, z. B. cabalwenn die -jStandardeinstellungen 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/syslogerzählt eine andere Geschichte; die OOM Killer hinter sich gelassen einigen psDeponien , die verdächtig sind , verpackt mit c++und cc1plusProzesse!

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 -jund 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 -jso 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?

Exp HP
quelle
Hinweis: Bei der letzten Frage, ich überlege Hinzufügen eines alias make="make -j4"die zu beseitigen Notwendigkeit für das Hinzufügen von -jNArgumenten, aber ich habe noch nicht zu Ende gedacht , alle möglichen Folgen ...
Exp HP
1
Für globale Grenzwerte nutzen Sie bitte die makeeigenen Einrichtungen und tun Sie dies export 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
Bananguin

Antworten:

6

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 -jauf einem kleinen Projekt ist durchaus sinnvoll . In anderen Projekten kann die Verwendung -johne Argument die Reaktionsfähigkeit des Systems ernsthaft beeinträchtigen. In einigen Projekten -j2wird 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 makezu make -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:

  1. Erfahren Sie, wie Sie Ihre Werkzeuge verwenden.

Beachten Sie auch, dass das -jFlag auf BSD make ist ein Argument erforderlich ist , und dass dieser Flag Nicht-Standard (der Unix - POSIX - Standard es nicht erwähnt).

Kusalananda
quelle
4

Sie können make auch einschränken mit -l:

-l [load], --load-durchschnitt [= load] Gibt an, dass keine neuen Jobs (Befehle) gestartet werden sollen, wenn andere Jobs ausgeführt werden und der Lastdurchschnitt mindestens load (eine Gleitkommazahl) ist. Entfernt ohne Argument ein vorheriges Lastlimit.

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.

Zitrax
quelle