Plus tôt aujourd'hui lors de la construction de quelque chose, j'ai décidé de courir make
comme
$ make -j
peut - être par habitude avec d' autres programmes tels que cabal
lorsque les -j
valeurs 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/syslog
raconte une histoire différente; le tueur OOM laissé derrière quelques ps
décharges qui sont soupçonneux emballés avec c++
et cc1plus
processus!
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 -j
et 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 -j
aussi dangereux qu'il me semble? Si oui, pourquoi diable est-il là, et que peut-on faire pour le protéger des idiots?
la source
alias make="make -j4"
pour éliminer la nécessité d'ajouter des-jN
arguments, mais je n'ai toujours pas réfléchi à toutes les conséquences possibles ...make
les propres installations de et faitesexport 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 finalemake -j128
avant de sortir un noyau.Réponses:
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 -j
sur un petit projet est parfaitement raisonnable. Dans d'autres projets, l'utilisation-j
sans 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:
Remarquez aussi que le
-j
drapeau BSDmake
ne nécessite un argument, et que ce drapeau est non standard (la norme POSIX Unix ne mentionne pas).la source
Vous pouvez également limiter la fabrication en utilisant
-l
: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
.la source