Pour compiler un progiciel sur un poste de travail avec de nombreux cœurs de processeur (disons 12), l'étape de configuration prend souvent beaucoup plus de temps que l'étape de compilation proprement dite car elle ./configure
effectue les tests un par un, tout en make -j
s'exécutant gcc
ainsi que d'autres commandes en parallèle.
Je pense que c'est un énorme gaspillage de ressources que de laisser les 11 cœurs restants inactifs la plupart du temps en attendant la fin du ralentissement ./configure
. Pourquoi doit-il effectuer les tests de manière séquentielle? Chaque test dépend-il les uns des autres? Je peux me tromper, mais il semble que la majorité d'entre eux soient indépendants.
Plus important encore, existe-t-il des moyens d'accélérer ./configure
?
Edit: Pour illustrer la situation, voici un exemple avec GNU Coreutils
cd /dev/shm
rm -rf coreutils-8.9
tar -xzf coreutils-8.9.tar.gz
cd coreutils-8.9
time ./configure
time make -j24
Résultats:
# For `time ./configure`
real 4m39.662s
user 0m26.670s
sys 4m30.495s
# For `time make -j24`
real 0m42.085s
user 2m35.113s
sys 6m15.050s
Avec coreutils-8.9 , ./configure
prend 6 fois plus longtemps que make
. Bien que vous ./configure
utilisiez moins de temps CPU (regardez les temps "utilisateur" et "sys"), cela prend beaucoup plus de temps ("réel") car il n'est pas parallélisé. J'ai répété le test plusieurs fois (avec les fichiers pertinents restant probablement dans le cache mémoire) et les délais sont à moins de 10%.
la source
Réponses:
Je me souviens des discussions sur la liste de diffusion Autoconf à propos de ce problème il y a environ 10 ans, alors que la plupart des gens n'avaient en fait qu'un seul cœur de processeur. Mais rien n'a été fait, et je soupçonne que rien ne sera fait. Il serait très difficile de configurer toutes les dépendances pour le traitement parallèle
configure
et de le faire de manière portable et robuste.Selon votre scénario particulier, il existe de toute façon plusieurs façons d'accélérer les exécutions de configuration. Par exemple:
dash
au lieu debash
as/bin/sh
. (Remarque: sous Debian, ildash
est corrigé de sorte qu'ilconfigure
ne l'utilise pas, car son utilisation rompt beaucoup deconfigure
scripts.)configure -q
.configure -C
. Voir la documentation Autoconf pour plus de détails.config.site
). Encore une fois, consultez la documentation.la source
make
peut être parallélisé maisconfigure
ouautoconf
non?sh -c "echo $i" > /dev/null
1000 fois prend environ 10 secondes sur ce système, mais seulement 1 à 2 secondes sur mes autres systèmes.configure
tests est en fait une opération de faible complexité (tri topologique) et a été résolu dans les premiers jours de l'informatique. Le vrai problème est que personne n'a pris la peine d'ajouter le code à autoconf pour le faire et le fait que de nombreux programmeurs modifient manuellement les fichiers générés. L'ensemble du système doit être réorganisé afin que la configuration ne soit plus effectuée par un script shell mais par un binaire résident lisant des fichiers de métadonnées.Vous avez été intelligent en utilisant ramdrive pour que le sourcetree réside, mais réfléchissez-y à deux fois - que fait la configuration? Il fait son travail en vérifiant non seulement votre sourcetree , mais aussi souvent le système pour les disponibilités de la bibliothèque, des compilateurs, etc. Dans ce cas, le problème d'accès réside parfois dans l'accès au disque - Vous le ferez beaucoup plus rapidement si vous avez pour par exemple un système de fichiers racine basé sur SSD.
la source
./configure
plusieurs reprises mais les manches suivantes prennent presque aussi longtemps que la première manche. Puisqu'il y a beaucoup de mémoire libre dans le système, je pense que le système exécute les compilateurs et les bibliothèques à partir du cache mémoire sans aller sur le disque../configure
fonctionne toujours dans une arborescence source fraîchement extraite). Je vais ajouter plus de détails dans le message d'origine (l'espace est limité ici)../configure
immédiatement après l'autre./configure
) et les deux exécutions prennent à peu près le même temps. Cela signifie-t-il que la mise en cache ne fonctionne probablement pas sur mon système?Si vous utilisez le gouverneur cpu ondemand, essayez d'utiliser celui de performance. Cela aide sur les i7 et a8-3850 de 40 à 50%. Cela ne fait pas beaucoup de différence sur le q9300.
Sur un processeur quad core, vous pourriez faire
(L'option -r devrait faire en sorte que vous n'ayez pas à faire cpufreq-set pour chaque cœur, mais sur mes ordinateurs, cela ne fonctionne pas.)
L'option de cache aide encore plus, cependant.
la source
Il existe de nombreux types de
./configure
scripts. Il existe des outils populaires ( autconf étant l'un d'entre eux) pour aider un développeur à créer un./configure
script, mais il n'y a pas de règle qui dit que chaque développeur doit utiliser ces outils, et même parmi ces outils, il peut y avoir de grandes variations dans la façon dont ces scripts sont construits.Je ne connais aucun
./configure
script populaire pouvant être exécuté en parallèle. La plupart des scripts construits par des outils populaires mettent au moins en cache une partie ou la totalité de leurs résultats, donc si vous l'exécutez à nouveau (sans faire demake clean
première, de toute façon), il s'exécute beaucoup plus rapidement la deuxième fois.Cela ne veut pas dire que cela ne pourrait pas être fait ... mais je soupçonne qu'il y a peu de motivation pour les personnes travaillant
autoconf
, par exemple, à le faire, car pour la plupart des packages, la phase de configuration est très rapide par rapport à la compilation et à la liaison réelles phases.la source
Le disque dur est le goulot d'étranglement dans ce cas. Pour accélérer la construction, construisez sur un système avec des disques rapides (lire: temps d'accès bas). Il y a beaucoup de bruit à propos des disques SSD, mais il y a eu des critiques à leur sujet qui n'affectent pas le temps de compilation de manière positive. C'est-à-dire que la construction sur SSD n'était pas tellement plus rapide que sur un lecteur sata décent. Je ne me souviens pas où j'ai lu ceci parce que l'article a quelques années.
Quoi qu'il en soit ... Untar pour éperonner et construire à partir de là.
la source
Votre question pourrait même être plus pertinente aujourd'hui, car nous avons des processeurs à douze cœurs avec des performances monocœur (assez) faibles. Les builds automatisés pour l'intégration continue (CI) gaspillent vraiment beaucoup de temps / d'énergie CPU pour chaque commit. Idem avec saut entre les branches.
Donc, passez en revue / lisez mes conseils sur l'accélération de la chose sur https://gitlab.com/gnuwget/wget2/wikis/Developer-hints:-Increasing-speed-of-GNU-toolchain .
"Pourquoi faut-il faire les tests de manière séquentielle? ..." Il y a en fait quelques choses qui pourraient être faites en parallèle, tandis que d'autres doivent être séquentielles. Plusieurs choses dépendent de l'environnement de construction - et le script de configuration lui-même est indépendant du système. Il ne contient même pas de bashismes, il fonctionne donc avec un shell POSIX pur.
Si vous voulez écrire un logiciel portable, il n'y a pas d'autre système de construction comme les autotools. Mais si cela ne vous dérange pas de la portabilité (large), évitez les outils automatiques - il existe une pléthore d'outils de construction rapides et suffisamment efficaces.
la source