Est-il possible d'accélérer ./configure?


29

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 ./configureeffectue les tests un par un, tout en make -js'exécutant gccainsi 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 , ./configureprend 6 fois plus longtemps que make. Bien que vous ./configureutilisiez 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%.


4
Il est ridicule et dommage qu'il n'y ait PAS de bons outils de construction. Tous ceux qui existent sont purement dus à l'inertie. Construire des binaires est une chose si compliquée et imprévisible.
Matt Joiner

Il effectue les tests de manière séquentielle, car ce serait un cauchemar de savoir comment faire du parallélisme sur le système particulier sur lequel on s'exécute.
Simon Richter

Réponses:


13

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 configureet 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:

  • Utilisez un shell plus rapide. Par exemple, envisagez d'utiliser dashau lieu de bashas /bin/sh. (Remarque: sous Debian, il dashest corrigé de sorte qu'il configurene l'utilise pas, car son utilisation rompt beaucoup de configurescripts.)
  • Si vous exécutez des builds à distance (via ssh, par exemple), j'ai constaté que la sortie de la console peut être assez lente. Pensez à appeler configure -q.
  • Si vous générez plusieurs fois le même projet, envisagez d'utiliser un fichier cache. Appelle configure -C. Voir la documentation Autoconf pour plus de détails.
  • Si vous créez de nombreux projets différents, envisagez d'utiliser un fichier de site ( config.site). Encore une fois, consultez la documentation.
  • Construisez plusieurs projets en parallèle.

2
Pourriez-vous s'il vous plaît expliquer un peu plus pourquoi makepeut être parallélisé mais configureou autoconfnon?
netvope

Il semble que j'ai des problèmes de performances avec le shell. L'exécution de sh -c "echo $i" > /dev/null1000 fois prend environ 10 secondes sur ce système, mais seulement 1 à 2 secondes sur mes autres systèmes.
netvope

1
GNU make utilise du code C assez compliqué pour démarrer et gérer plusieurs processus. les scripts de configuration sont écrits dans le shell Bourne portable. Ce serait possible, mais probablement très difficile.
Peter Eisentraut

4
Le tri des dépendances entre les configuretests 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.
billc.cn

1
Veuillez ajouter une référence à la discussion mentionnée sur la liste de diffusion (un lien vers l'archive).
Karl Richter

3

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.


1
Malheureusement, il semble que les SSD n'aideront pas beaucoup. J'ai essayé de courir à ./configureplusieurs 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.
netvope

1
si vous avez essayé d'exécuter ./configure à plusieurs reprises (et s'il est créé par autoconf), tous les résultats devraient être mis en cache et devraient très bien fonctionner. Vous pouvez publier le script de configuration pour que nous puissions y jeter un œil si vous souhaitez plus d'aide. Je suis sûr qu'il y a une abondance de gourou ici
bubu

Je l'ai en fait nettoyé entre les exécutions ( ./configurefonctionne 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).
netvope

Je viens de tester sans nettoyer le dossier (c'est-à-dire qu'il s'exécute ./configureimmé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?
netvope

Je vais chercher des coreutils et essayer de configurer quand j'aurai le temps. Restez à l'écoute.
bubu

3

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

for cpu in `seq 0 3`; do sudo cpufreq-set -g performance -c $cpu; done

(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.


3

Il existe de nombreux types de ./configurescripts. Il existe des outils populaires ( autconf étant l'un d'entre eux) pour aider un développeur à créer un ./configurescript, 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 ./configurescript 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 de make cleanpremiè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.


2
Il y a cependant une bonne raison d'utiliser ces outils: ils sont matures et ils gardent une trace de beaucoup de petits détails. Je pense que Linux ne serait pas en si bonne position dans le monde embarqué si vous ne pouviez pas simplement pointer le script de configuration vers votre compilateur croisé et le faire fonctionner prêt à l'emploi 90% du temps.
Simon Richter

2

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à.

mkdir /tmp/tmp 
mount -t tmpfs -o size=400M tmpfs /tmp/tmp 
cd /tmp/tmp
tar xjf somesourcetarball-1.1.33.tar.bz2

1
Merci, mais je compilais déjà sur / dev / shm qui est un tmpfs :-)
netvope

0

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.