2010-08-05 4 views
11

En Faites ce drapeau existe:Comment déterminer une bonne valeur pour --load-average en utilisant gnu Make?

-l [charge], --load moyenne [= charge] Indique qu'aucun nouveau travail (commandes) devraient démarrer s'il y a d'autres emplois en cours d'exécution et la charge la moyenne est au moins la charge (un nombre à virgule flottante). Sans argument, supprime une limite de charge précédente.

Avez-vous une bonne stratégie pour quelle valeur utiliser pour la limite de charge? Cela semble beaucoup différer entre mes machines.

Répondre

3

La charge acceptable dépend du nombre de cœurs de processeur. S'il y a un noyau, alors la charge moyenne plus de 1 est la surcharge. S'il y a quatre cœurs, la moyenne de charge de plus de quatre est surchargée.

Souvent, il suffit de spécifier le nombre de cœurs en utilisant le commutateur -j.

Voir quelques chiffres empiriques ici: https://stackoverflow.com/a/17749621/412080

+2

Expérimentalement si je remarqué sur une machine tout autre utilisation de synchronisation -j I a obtenu les compilations les plus rapides en utilisant -j8 sur une machine à 4 cœurs. – Zitrax

+2

J'ai une expérience similaire. Probablement parce qu'il y a quelques étapes de compilation liées aux E/S, de sorte que lorsqu'un processus de compilation bloque les E/S, un autre peut utiliser cette heure pour la compilation. –

3

Je recommande de ne pas utiliser l'option -l. En principe, -l semble supérieur à -j. -j dit, commencer ce nombre d'emplois. -l dit, assurez-vous que de nombreux travaux sont en cours d'exécution. Souvent, ce sont presque la même chose, mais lorsque vous avez des travaux liés E/S sont d'autres bizarreries, alors -l devrait être mieux. Cela dit, le concept de moyenne de charge est un peu douteux. C'est nécessairement un échantillon de ce qui se passe dans le système. Donc, si vous exécutez make -j -l N (pour certains N) et que vous avez un fichier make bien écrit, make lancera immédiatement un grand nombre de tâches et épuisera des descripteurs de fichier ou de mémoire avant même que le premier échantillon du chargement du système puisse être pris. En outre, la comptabilisation de la moyenne de charge diffère d'un système d'exploitation à l'autre, et d'autres ne le sont pas du tout.

En pratique, vous serez aussi bien en utilisant -j et aurez moins de maux de tête. Pour obtenir plus de performance sur la construction, ajustez vos makefiles, jouez avec les options du compilateur, et utilisez ccache ou similaire.

(je soupçonne que la raison initiale de l'option -l vient d'une époque où plusieurs processeurs étaient rares et d'E/S était vraiment lent.)

+1

Avez-vous déjà essayé cela récemment? A partir de GNU make 3.81 (sorti en 2006), GNU make implémente un algorithme pour ajuster son idée de la charge moyenne du système en fonction du nombre de jobs invoqués par make dans la dernière seconde. Ce n'est pas idéal, bien sûr, puisque c'est juste une supposition, mais cela devrait empêcher l'invocation de 100 emplois dès le début. – MadScientist

+1

Je ne sais pas combien il est devenu plus intelligent en interne, mais le comportement qu'il va commencer beaucoup de travaux tout de suite est encore facilement reproductible. –

+1

Malheureusement, selon mon expérience, vous avez aussi besoin de -l. Le problème est que vous allez souvent avoir plusieurs systèmes de création complexes qui ne se connaissent pas nécessairement, donc le mécanisme qui partage le nombre de tâches n'est pas toujours utile.(Essayez des constructions comme openssl, dbus, curl et une douzaine d'autres bibliothèques pour Android et iOS, vous allez lancer des builds qui ne font pas vraiment partie de votre propre système de build.) –

Questions connexes