Est-ce que `make -j` (sans argument) est dangereux? [fermé]

13

Plus tôt aujourd'hui lors de la construction de quelque chose, j'ai décidé de courir makecomme

$ make -j

peut - être par habitude avec d' autres programmes tels que caballorsque les -jvaleurs par défaut à une limite raisonnable.

Environ 20 secondes plus tard, l' ensemble de mon bureau s'arrête . Je recherche divers signes d'activité. Aucun fan ne tourne. Le voyant du disque dur est vert fixe, mais je n'entends aucune activité de disque. Hmmmmm. Après 10 minutes de silence, je vois enfin une réponse à la première pression sur une touche que j'ai faite il y a très longtemps, et je commence également à entendre le son trop familier du battement de disque. 20 minutes plus tard, essayant lentement de me frayer un chemin dans un terminal de cette machine qui ne répondait pas, j'ai cédé et utilisé REISUB.


Au début, je pensais qu'une application de bureau non liée devait être le coupable, car j'avais depuis longtemps des limites de mémoire placées sur les sessions de bash interactives pour m'empêcher de me mettre exactement dans ce genre de situation! Mais /var/log/syslograconte une histoire différente; le tueur OOM laissé derrière quelques psdécharges qui sont soupçonneux emballés avec c++et cc1plusprocessus!

Voici une analyse de fréquence de l'un de ces vidages:

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

Je vérifie donc la page de manuel de GNU make: (non souligné dans l'original)

-j [jobs], --jobs [= jobs] Spécifie le nombre de jobs (commandes) à exécuter simultanément. S'il y a plus d'une option -j, la dernière est effective. Si l'option -j est donnée sans argument, make ne limitera pas le nombre de travaux pouvant s'exécuter simultanément.


Je suis réticent à voir si je peux reproduire le problème (docteur, ça fait mal quand je fais ça ...) , mais les résultats de l'enquête semblent jusqu'à présent être un home run: clairement, make -jet les centaines de processus résultants doivent avoir été la cause du blocage et du débordement de disque. Cela dit, en cherchant sur Internet, je ne trouve pas beaucoup d'avertissement contre cela. Suis-je en train de sauter aux conclusions?

Est-ce make -jaussi dangereux qu'il me semble? Si oui, pourquoi diable est-il là, et que peut-on faire pour le protéger des idiots?

Exp HP
la source
Remarque: Sur la dernière question, j'envisage d'ajouter un alias make="make -j4"pour éliminer la nécessité d'ajouter des -jNarguments, mais je n'ai toujours pas réfléchi à toutes les conséquences possibles ...
Exp HP
1
Pour les limites globales, veuillez utiliser makeles propres installations de et faites export MAKEFLAGS="-j 4". Pour de plus amples investigations, je conseille de lire avant de taper . PS: <nombre de cœurs> + 2 me sert bien depuis près de deux décennies maintenant. À l'époque, Linus a fait une finale make -j128avant de sortir un noyau.
Bananguin

Réponses:

6

Il existe des outils qui vous permettent de vous tirer une balle dans le pied de nombreuses façons imaginatives. C'est pour que vous puissiez utiliser votre imagination pour résoudre des problèmes sans être limité par ce que quelqu'un d'autre pense être "sain d'esprit".

Exécuter make -jsur un petit projet est parfaitement raisonnable. Dans d'autres projets, l'utilisation -jsans argument compromettra sérieusement la réactivité du système. Dans certains projets, l'utilisation de builds parallèles, même avec -j2, interrompra complètement la build (les fichiers créés par un processus de make parallèle ne sont pas là à temps pour un autre, etc.).

Personnellement , j'éviter aliasing makeà make -j4(comme vous le dites que vous envisagez, dans les commentaires). Je trouve qu'il vaut mieux dire explicitement à la machine quoi faire, pour que je sache ce qu'elle fera. Dans quelques jours, j'aurai oublié cet alias et je me demanderai pourquoi les quatre projets que je construis dans des terminaux séparés rendent mon système insensible.

Quant à "dangereux" ... Le mot signifie différentes choses dans différents contextes. Oui, c'est "dangereux" car cela peut rendre le système insensible. Oui, c'est "dangereux" car il peut très bien bloquer le processus de construction à mi-chemin de la construction. Mais non, ce n'est pas "dangereux" dans le sens où il reformatera votre disque dur ou commencera à supprimer des fichiers aléatoires.

Alors, comment le protéger des idiots?

Voici un guide étape par étape infaillible:

  1. Apprenez à utiliser vos outils.

Remarquez aussi que le -jdrapeau BSD make ne nécessite un argument, et que ce drapeau est non standard (la norme POSIX Unix ne mentionne pas).

Kusalananda
la source
4

Vous pouvez également limiter la fabrication en utilisant -l:

-l [charge], --load-average [= charge] Spécifie qu'aucun nouveau travail (commandes) ne doit être démarré si d'autres travaux sont en cours d'exécution et que la moyenne de charge est au moins chargée (un nombre à virgule flottante). Sans argument, supprime une limite de charge précédente.

Mais notez que cela ne semble pas aider à l' exécuter comme ceci: make -j -l4.

Trop de travaux sont démarrés avant que la moyenne de charge ne dépasse la limite (en fonction de mon expérience). Ainsi, une combinaison peut fonctionner, par exemple make -j8 -l4.

Zitrax
la source