Dans Gentoo Linux, il est possible de définir la MAKEOPTS
variable dans /etc/portage/make.conf
pour indiquer make
combien de tâches elle doit exécuter en parallèle lors de la construction des packages. Comme j'ai un processeur double cœur, j'ai naïvement choisi d'utiliser l' -j2
option: un travail par cœur, donc les deux ont quelque chose à faire. Le "problème" est qu'il existe de nombreuses références qui indiquent aux utilisateurs disposant d'un processeur dual-core de définir l' -j3
option à la place. Certains d'entre eux sont:
- Manuel Gentoo
- Wiki Gentoo
- Page de manuel de make.conf (5)
Par exemple, le manuel Gentoo dit:
Un bon choix est le nombre de CPU (ou cœurs de CPU) dans votre système plus un, mais cette directive n'est pas toujours parfaite.
Mais quelle est la justification de la règle "CPU + 1"? Pourquoi ce travail supplémentaire?
La page de manuel make.conf (5) dit même:
Les paramètres suggérés se situent entre CPU + 1 et 2 * CPU + 1.
J'ai également lu la section 5.4 (Exécution parallèle) dans la make
page d'informations et l' make
explication de la page de manuel de l' -j
option, mais il semble qu'il n'y ait pas de réponses.
Réponses:
Il n'y a pas de règle simple qui fonctionne toujours. Les gens pourraient recommander une figure en particulier parce qu'ils ont expérimenté une compilation particulière sur une machine particulière et que c'était le meilleur réglage, ou parce qu'ils ont suivi un raisonnement qui peut ou non avoir une relation avec la réalité.
Si vous avez beaucoup de RAM, le facteur limitant dans une longue compilation sera le temps CPU. Ensuite, une tâche par CPU, plus une tâche en attente pour ces blocs d'E / S occasionnels, est un bon paramètre. Cela en fait
-j3
un processeur double cœur (ou plus précisément, pour une machine double processeur - si chaque cœur est hyperthreadé, ce serait donc 4 processeurs-j5
).Si vous avez très peu de RAM, un facteur limitant peut être que vous ne pouvez pas avoir beaucoup de travaux simultanés, sinon ils continueront à se faire mutuellement. Par exemple, si vous ne pouvez pas installer confortablement deux instances de compilateur en mémoire, cela
make -j2
peut déjà être plus lent quemake
. Étant donné que cela dépend du nombre de processus de compilation que vous pouvez insérer simultanément dans la RAM, il n'y a aucun moyen de dériver un chiffre général.Entre les deux, il peut être avantageux d'avoir plus d'emplois. Si chaque processus du compilateur est petit, mais que la construction dans son ensemble touche beaucoup de données, les E / S disque peuvent être le facteur de blocage. Dans ce cas, vous souhaiterez plusieurs tâches par CPU à la fois, de sorte qu'il y ait toujours une tâche utilisant chaque CPU pendant que d'autres attendent les E / S. Encore une fois, cela dépend beaucoup du travail de génération et de la RAM disponible, ici de ce qui est disponible pour le cache de données (il y a un optimum après lequel trop de travaux pollue trop le cache).
la source
-j2
sur mon système. En effet, j'ai essayé d'émerger à la foisgcc
etfirefox
avec des paramètres allant-j1
jusqu'à-j5
(pour un total de 10 commandes d'émergence), et il semble que bien que ce-j2
soit nettement plus rapide que-j1
, les trois autres paramètres sont comparables-j2
.Je suppose que c'est un peu heuristique - permettre
make
de lancer desCPUs + 1
processus est de s'assurer que:Mais, encore une fois, c'est heuristique et le manuel de FreeBSD recommande toujours
make -j4
pour un seul processeur.la source
Généralement, il y a des raisons de démarrer plus d'emplois que le nombre de cœurs. Pour la compilation en C à l'aide de gcc, si -pipe n'est pas défini dans les options de gcc, il effectue ses actions (prétraitement, première exécution, optimisations et assemblage) en séquence à l'aide de fichiers temporaires; -pipe change cela en utilisant des tuyaux entre les sous-processus. (L'ajout de -pipe est par défaut pour FreeBSD mais n'est pas traditionnel sous Linux.) Donc, si vous avez 2 cœurs et autorisez 2 travaux en parallèle, ils passeront un certain temps dans les E / S disque. La recommandation d'ajouter 1 emploi semble être liée à ces spécificités. Mais pour obtenir la réponse finale, vous devriez trouver qui et quand a ajouté cette recommandation et lui demander :) ou demander dans la liste de diffusion de Gentoo devels.
la source
Fondamentalement, ce nombre est ce que les auteurs appellent le bon sens. Au mieux, c'est une bonne supposition. Pour autant que je sache, le processus de création qui est généré lorsque vous tapez
make
est déjà compté,-j3
vous pouvez donc vous retrouver avec le processus principal en attente, tandis que les deux autres sont en cours de compilation.Cependant, lorsque j'ai utilisé Gentoo, la règle de base était
<#cpus>*2 + 1
.Tout dépend de ce que vos traces de poulet, vos feuilles de thé ou votre boule magique 8 vous disent sur les E / S de disque qui doivent avoir lieu et la planification de votre noyau Linux actuel. [commencer noyau de ce poste] De mon expérience personnelle
-j
(n'est pas Gentoo spécifique), tout entre #cpus + 1 et #cpus * 2 + 1 donne de beaux résultats [fin du noyau de ce poste] et vous en moyenne ne sera guère noter les différences. Les processeurs et les noyaux sont assez bons de nos jours.MAIS tout cela change lorsque: a) vous utilisez en fait plus d'une boîte pour compiler (du'h) ou b) développez votre propre code
Un
-j
attribut plus élevé est plus susceptible d'afficher des dépendances inconnues auparavant.Et à côté: ne vous fiez pas au nombre de cœurs, mais au nombre de flux simultanés que les CPU prennent. (Hypertheading!)
la source