Bonjour Journal,
Je vient ici me plaindre, et en profiter pour voir si vous aviez une idée pour corriger le tir.
Voici l'explication : J'ai un énorme logiciel (en C AINSI) qui génère une suite de librairie (une 10aine) statique (en mode release, les librairies tournent aux alentour de 40Mo), et une suite de binaire (environ 500), linké avec toute les librairies en statique.
Les librairies statique étant interdépendant, je suis obligé d'utiliser --start-proc et --end-proc du linker pour qu'il répète régulièrement les librairies (du genre -la -lb -la -lb -la -lb). L'autre solution est de passer du temps à chercher les dépendances et de le répéter manuellement.
Je compile l'ensemble sur de machine a peu prés équivalente. Une sous Windows avec MinGW et l'autre sous Linux avec GCC.
Et là c'est le malheur. Sous Windows la phase de compilation dure une 10aine d'heure avec MinGW (encore moins avec VisualStudio) et qui met plus de 48H sous Linux.
La phase la plus longue (et la plus consommatrice en mémoire) est la phase de link...
Comment se fait-il que Linux soit plut lent à Compiler et à Linker que Windows (alors que MinGW est normalement un GCC pour Windows). Est-ce que Windows gère mieux la mémoire ?
Qu'est il possible pour accélérer la phase de Linkage (passer les librairies en dynamique n'est pas possible, les binaires doivent être statique).
J'avoue ne pas savoir trop quoi penser. Je savais que GCC était lent, mais là c'est impressionnant. Je suis du coup un peu déçus de GCC (ou de Linux, je ne sais pas à qui donner la faute).
Est-qu'il y a des options à GCC pour dire de compiler plus rapidement ?
# forum?
Posté par ackernul . Évalué à -9.
[^] # Re: forum?
Posté par grid . Évalué à 10.
Parce que GCC est une loutre bouffie et lente.
J'aime ce journal qui dénonce.
[^] # Re: forum?
Posté par IsNotGood . Évalué à 0.
C'est crétin, car il n'a pas de problème avec GCC sous Windows...
Tu veux un journal car tu crois que c'est l'occasion de dézinguer GCC.
Son problème doit seulement être un bug.
# .
Posté par snt . Évalué à 10.
- Est-ce que le CPU tourne à fond pendant la compil et le link ? Si c'est pas le cas, ça signifie que le proc attend des données. Dans ce cas il faut tester le disque. Un petit benchmark sur les deux machines peut te donner des infos intérressantes. Si il y'a un disque 5 fois plus rapide que l'autre, ça peut jouer fortement sur le temps total ( il n'y a pas si longtemps j'ai vu une base oracle sur un serveur linux plus que costaud se trainer. Il y avait une version pourrie de drivers raid qui faisait se trainer les I/O à 2 MO/s ! ).
[^] # Re: .
Posté par vincent_k (site web personnel) . Évalué à 2.
[^] # Re: .
Posté par benja . Évalué à 6.
[^] # Re: .
Posté par phoenix (site web personnel) . Évalué à 2.
[^] # Re: .
Posté par Nicolas Boulay (site web personnel) . Évalué à 3.
"La première sécurité est la liberté"
[^] # Re: .
Posté par duf . Évalué à 8.
En gros (j'y vais au rouleau compresseur) il faut que tu aies un minimum de runqueue (première colonne du vmstat) soit une valeur max de 4 pour un dual core (et encore certains extrémistes diraient 2), ensuite il ne faut pas que tu aies de process bloqués (colonne b), que ta valeur de swap ne bouge pas (grosse perte de performance en général), ton free il doit déjà être à une valeur basse, le buffer normalement tu t'en fous, le cache pareil même si on pourrait en discuter. Ensuite le si/so je l'ai déjà dit, le reste on zap et vient la colonne "us" qui doit avoir dans ton cas la valeur la plus haute possible par rapport à ta consommation totale de CPU. La valeur "sys" faudrait qu'elle soit inférieure à 10% quand t'es à 100%, l'idle on passe et le "wa" disons qu'on oublie pour éviter de faire sursauter les ingés BDD ou de stockage :-) Mais si tu fais des lectures/écritures sur disque local alors là ça peut monter haut et dans ce cas il faudrait réfléchir à avoir physiquement une source différente de la cible (pareil si tu utilises des disques réseaux).
Donc si t'as un profil différent, il est fort probable que les ressources du serveur soient mal utilisées pendant la compilation. Maintenant reste à savoir pourquoi.
Sinon quand tu parles de 1Go, c'est 1Go de RSS (RES) ou de VSZ (VIRT) ? Peut être que tu dépasses la mémoire de la machine car j'ai lu plus bas qu'il y avait 2Go sur la machine, donc si t'as 2 ld, potentiellement tu exploses les ressources dispos et là tu dois avoir du swap (cf remarque plus haut).
Cdt,
# Bibliothèques
Posté par Damien Thébault . Évalué à 10.
Sinon, je sais pas ce que c'est --start-proc, mais je connais un --start-group qui dit ça :
--start-group archives --end-group
The archives should be a list of archive files. They may be either
explicit file names, or -l options.
The specified archives are searched repeatedly until no new unde‐
fined references are created. Normally, an archive is searched
only once in the order that it is specified on the command line.
If a symbol in that archive is needed to resolve an undefined sym‐
bol referred to by an object in an archive that appears later on
the command line, the linker would not be able to resolve that ref‐
erence. By grouping the archives, they all be searched repeatedly
until all possible references are resolved.
Using this option has a significant performance cost. It is best
to use it only when there are unavoidable circular references
between two or more archives.
[^] # Re: Bibliothèques
Posté par phoenix (site web personnel) . Évalué à 2.
Mais comme j'utilise la même option sous Windows et sous Linux, je ne crois pas que c'est cette partie qui change énormément (bien que je dois pouvoir y gagner si je trouve le bonne ordre).
[^] # Re: Bibliothèques
Posté par Nicolas Boulay (site web personnel) . Évalué à 6.
"La première sécurité est la liberté"
[^] # Re: Bibliothèques
Posté par phoenix (site web personnel) . Évalué à 2.
[^] # Re: Bibliothèques
Posté par Nicolas Boulay (site web personnel) . Évalué à 3.
"La première sécurité est la liberté"
[^] # Re: Bibliothèques
Posté par phoenix (site web personnel) . Évalué à 2.
Le problème est qu'il y a 11 librairies qui peuvent dépendre l'une de l'autre, j'ai donc des milliers de ligne de undefined reference, et j'ai du mal à retrouver qui va avant quoi (et avec les dépendances circulaire, il faut parfois mettre deux fois la librairie sur la même ligne :( )
Une fois compilé, est-il possible avec une commande, d'extraire l'ordre des dépendances des librairies statique ?
[^] # Re: Bibliothèques
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
Les outils pour jouer avec les symboles sont souvent nm et objdump, je crois que cela fait parti des binutils.
"La première sécurité est la liberté"
[^] # Re: Bibliothèques
Posté par アントニ ドミ . Évalué à 3.
[^] # Re: Bibliothèques
Posté par Sylvain Sauvage . Évalué à 1.
# gold
Posté par benja . Évalué à 8.
[^] # Re: gold
Posté par Kerro . Évalué à 7.
Je dois être un vieux con mais je ne vois pas de lien de cause à effet entre "codé en C++" et "le rend plus rapide" :-)
[^] # Re: gold
Posté par benja . Évalué à 10.
"At the moment gold has only one significant advantage over the
existing linker: it is faster. On large C++ programs, I have measured
it as running five times faster." http://sourceware.org/ml/binutils/2008-03/msg00162.html
[^] # Re: gold
Posté par Troy McClure (site web personnel) . Évalué à 6.
[^] # Re: gold
Posté par benja . Évalué à 2.
Maintenant, il s'avère que gold implémente aussi un support partiel des scripts ld. Si j'ai bien compris, sa plus grande vitesse est due au fait qu'il "hardcode" plus de choses, tout en se limitant au format elf.
[^] # Re: gold
Posté par phoenix (site web personnel) . Évalué à 2.
Merci de l'information
# ...
Posté par M . Évalué à 10.
Les librairies statique étant interdépendant, je suis obligé d'utiliser --start-proc et --end-proc du linker pour qu'il répète régulièrement les librairies (du genre -la -lb -la -lb -la -lb). L'autre solution est de passer du temps à chercher les dépendances et de le répéter manuellement.
Ca te choques pas d'avoir des lib interdépendantes ?
C'est quoi l'intérêt d'avoir plusieurs lib dans ce cas ?
[^] # Re: ...
Posté par Victor STINNER (site web personnel) . Évalué à 10.
Est-ce qu'il ne faudrait pas commencer par là ? Ne pas compiler en statique, mais utiliser des bibliothèques dynamiques.
[^] # Re: ...
Posté par phoenix (site web personnel) . Évalué à 5.
Ensuite, j'ai une autre problématique, le logiciel est vieux de quelque milliers d'année (1992), il y a donc des choses qui ont été écrites d'une certaine manière (inter-dépendance des librairies), qui même si je trouve ça dommage, je ne vais pas pouvoir y faire grand chose vu la taille du bousin.
[^] # Re: ...
Posté par Pierre Bourdon . Évalué à 3.
J'avoue avoir du mal à comprendre la logique.
[^] # Re: ...
Posté par Troy McClure (site web personnel) . Évalué à 10.
[^] # Re: ...
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
"La première sécurité est la liberté"
# Tuyaux et compilation parallèle ?
Posté par ǝpɐןƃu∀ nǝıɥʇʇɐW-ǝɹɹǝıԀ (site web personnel) . Évalué à 8.
- l'option -pipe pour éviter d'écrire des fichiers intermédiaires
- deux processus par cœur de processeur pour optimiser la latence.
(J'imagine que même les compilateurs sous widows savent faire ce genre de chose.) Est-ce que ces deux astuces sont bien utilisés de manière équivalentes dans les compilation comparée ? Aussi, est-ce que les niveaux d'optimisation sont comparables ?
« IRAFURORBREVISESTANIMUMREGEQUINISIPARETIMPERAT » — Odes — Horace
[^] # Re: Tuyaux et compilation parallèle ?
Posté par Jerome Herman . Évalué à 8.
Ca dépend de l'espace mémoire nécessaire à la compilation. C'est bien beau de loger les intermédiaire de compilation en mémoire, mais si c'est pour que la compilation en elle même se fasse dans le swap c'est pas super rentable.
deux processus par cœur de processeur pour optimiser la latence.
Houlà ! C'est bien d'avoir un processus de plus que le nombre de CPU pour avoir toujours une suite compilation prête en mémoire quand un processus fini. Eventuellement si on a beaucoup de coeur ou une très grosses suite de petites compils on peut en mettre deux voire trois de plus que le nombre de CPU. Mais je doute fort que mettre 8 processus de compil sur un quadricore soit rentable (toujours pour des questions d'occupation mémoire). En tout cas ici sur mon Q6600 je vais plus vite avec 5 ou 6 process (5 pour le C++, 6 pour le C Ansi) qu'avec 8.
[^] # Re: Tuyaux et compilation parallèle ?
Posté par phoenix (site web personnel) . Évalué à 1.
Pour la compilation multi-cpu, je suis à trois process par CPU (make -j3) sur les deux machines (des dual core).
Je pourrais monté à plus pendant la phase de compilation (CC) mais je suis limité en mémoire pendant la phase de link (LD), 3 processus est alors le maximum.
[^] # Re: Tuyaux et compilation parallèle ?
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
"La première sécurité est la liberté"
# option d'optimisation ?
Posté par Adrien . Évalué à 2.
Une compilation en -O0 améliorerais peut-être la vitesse de compilation, si c'est ça qui t'intéresse le plus ?
[^] # Re: option d'optimisation ?
Posté par phoenix (site web personnel) . Évalué à 1.
[^] # Re: option d'optimisation ?
Posté par JoeltheLion (site web personnel) . Évalué à 4.
# options
Posté par Axioplase ıɥs∀ (site web personnel) . Évalué à 6.
Tu peut tout à fait faire ta liste d'options de compilation (-fno-fast-math -o3,-do-what-I-mean…) et reposer ta question sur la ML de gcc en indiquant cette liste et la version de gcc que tu utilises.
Il y a des cas pathologiques où gcc pédale dans la semoule, surtout avec du code C généré (car tu peux avoir des fonctions de milliers de lignes).
Regarde aussi si la compilation swappe à mort.
Dans tous les cas, pour gagner du temps, utilise distcc et ccache. Tu pourras passer de 40 heures à 10 heures la prochaine fois, ou de 10 à quatre, qui sait.
[^] # Re: options
Posté par phoenix (site web personnel) . Évalué à 2.
Mais j'enverrai un mail à la mailing list si jamais je ne peux pas améliorer plus les perfs avec gold ou -pipe.
# Machines "à peu près" équivalentes
Posté par gUI (Mastodon) . Évalué à 3.
Parce que la compilation bouffe énormément de RAM, ne serait-ce que pour le cache des fichiers utilisés.
En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.
[^] # Re: Machines "à peu près" équivalentes
Posté par phoenix (site web personnel) . Évalué à 2.
# Quel linker ?
Posté par Matthieu Moy (site web personnel) . Évalué à 6.
Sous Linux, a priori, c'est GNU ld qui sera appelé. Mais est-ce le cas sous Windows (gcc --verbose te le dira) ? Je ne serai pas surpris que ce soit simplement un autre linker, plus rapide, qui soit applé.
[^] # Re: Quel linker ?
Posté par phoenix (site web personnel) . Évalué à 3.
Thread model: win32
gcc version 3.4.5 (mingw-vista special r3)
D'après ce que je crois lire, c'est ld aussi, mais peut-être un ld made in mingw.
[^] # Re: Quel linker ?
Posté par Troy McClure (site web personnel) . Évalué à 6.
# Ranlib?
Posté par SChauveau . Évalué à 4.
Vérifie qu'elles possèdent un index des symboles avec
# nm -s libXXX.a | grep "Archive index"
Tu peux recréer l'index avec la commande ranlib:
# ranlib libXXX.a
Sur les gros projets, la présence des informations de debug peut aussi être une cause de lenteur lors du link. Essaye donc de retirer -g où c'est possible.
# Version de gcc et cygwin ?
Posté par Leroy Frederic (site web personnel) . Évalué à 1.
Car c'est connu que le passage du 2.9x au 3.x s'est accompagné d'une grosse baisse de performance.
Par contre pour ld, j'en sais rien.
[^] # Re: Version de gcc et cygwin ?
Posté par phoenix (site web personnel) . Évalué à 1.
# Merci à tous pour toutes les informations
Posté par phoenix (site web personnel) . Évalué à 6.
Voilà ce que j'ai changé :
- utilisation de l'option -pipe
- utilisation du linker gold
Je suis passé de plus de 40h à 75m ... La phase de link sur les exe (qui sont en faite au nombre de 800) passe de quelque minute par exe à quelque seconde (voir centième de seconde).
Je pense que c'est surtout grâce à gold. J'espère qu'il est maintenu et qu'il sera améliorer, car c'est vraiment un très bon linker (grâce à lui la compilation est plus rapide que celle avec VisualStudio sous Windows).
Merci
[^] # Re: Merci à tous pour toutes les informations
Posté par plic . Évalué à 10.
Te voilà un peu plus près des étoiles.
La faculté de citer est un substitut commode à l'intelligence -- Somerset Maugham
[^] # Re: Merci à tous pour toutes les informations
Posté par Romeo . Évalué à 3.
[^] # Re: Merci à tous pour toutes les informations
Posté par Nicolas Boulay (site web personnel) . Évalué à 3.
je pense que c'est celui-ci qui augmente les perfs.
D'après mes derniers essais, -pipe ne sert à rien du tout (surtout si cela provoque un swap) car les buffers disques prennent le relais.
"La première sécurité est la liberté"
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.