Pourquoi les gens recommandent l'option -j3 pour make lorsqu'ils ont un processeur dual-core?

18

Dans Gentoo Linux, il est possible de définir la MAKEOPTSvariable dans /etc/portage/make.confpour indiquer makecombien 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' -j2option: 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' -j3option à la place. Certains d'entre eux sont:

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 makepage d'informations et l' makeexplication de la page de manuel de l' -joption, mais il semble qu'il n'y ait pas de réponses.

Francesco Turco
la source

Réponses:

13

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 -j3un 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 -j2peut déjà être plus lent que make. É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).

Gilles 'SO- arrête d'être méchant'
la source
Je ne savais pas que si les cœurs de processeur sont hyperthreadés, alors chacun d'eux compte pour deux. Quoi qu'il en soit, il semble que mon processeur ne prenne pas en charge Hyper Threading.
Francesco Turco
J'ai accepté cette réponse. Quoi qu'il en soit, j'ai choisi de rester -j2sur mon système. En effet, j'ai essayé d'émerger à la fois gccet firefoxavec des paramètres allant -j1jusqu'à -j5(pour un total de 10 commandes d'émergence), et il semble que bien que ce -j2soit nettement plus rapide que -j1, les trois autres paramètres sont comparables -j2.
Francesco Turco
7

Je suppose que c'est un peu heuristique - permettre makede lancer des CPUs + 1processus est de s'assurer que:

  1. il n'y aurait pas d'écart entre un processus de travail qui vient de se terminer et un travailleur encore à exécuter - un peu comme le pré-remplissage de la file d'attente d'exécution.
  2. il n'y aurait pas trop de processus concurrents pour entraîner un surcoût notable avec ce pré-remplissage de la file d'attente d'exécution.

Mais, encore une fois, c'est heuristique et le manuel de FreeBSD recommande toujours make -j4pour un seul processeur.

poige
la source
5

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.

Netch
la source
2

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 makeest déjà compté, -j3vous 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 -jattribut 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!)

Bananguin
la source