usages recommand
Le
Christophe PEREZ

Bonjour,
De longue date, sous Gentoo, j'ai par habitude de configurer portage pour
que emerge utilise ccache ET distcc pour chacune de mes machines.
Mais je viens de réaliser que ce n'est le cas qu'en local. En effet, la
compilation distance par distcc elle, n'utilise pas le cache de ccache,
tout au moins pour ce que je vois et ce que j'en comprends.
En plus clair, j'ai une machine A et une machine B, toutes les 2 avec
gentoo à jour, donc même gcc, distcc et ccache.
Si je lance une première compilation par emerge de firefox (une nouvelle
version jamais compilée sur aucune des machines) sur la machine A, le
ccache de la machine A va se "remplir", mais comme (à priori) le distcc
de la machine B ne fait pas appel à ccache, celui de B ne bougera pas.
Si ensuite, je lance cette même compilation de firefox sur la machine B,
je vais avoir le ccache de la machine B qui va se "remplir", mais celui
de la machine A ne sera pas utilisé puisque son distcc ne fait pas appel
à ccache.
Du coup, aucun des 2 ccaches n'aura été utile, et ne le sera jamais, sauf
si je recompile la même version de firefox.
Bon, je ne suis sûr de rien de ce que j'avance là, c'est juste pour
lancer la discussion et faire comprendre ou m'amène mon raisonnement.
Qu'en pensent les vrais connaisseurs ?
Ai-je raison ?
Est-ce un fonctionnement normal parce que pour une raison qui m'échappe
ça doit fonctionner comme ça ?
Et dans le cas contraire, que faut-il changer à la configuration de distcc
pour qu'il exploite ccache, si possible à la méthode gentoo ?
Parce que je lis bien un truc sur le sujet dans le man de distcc, mais
déjà je n'y comprends pas grand chose, mais en plus, je ne vois pas
comment ça s'adapterait à la sauce gentoo. Et mes recherches sur le net
sur le sujet ne donnent pas grand chose.
NB : je ne cherche pas à faire l'usine à gaz qui consisterait à avoir un
ccache commun à toutes les machines dans lequel taperaient toutes les
compilations. Je voudrais juste que lorsque distcc délègue une tache N à
une machine, celle-ci exploite son ccache.
De longue date, sous Gentoo, j'ai par habitude de configurer portage pour
que emerge utilise ccache ET distcc pour chacune de mes machines.
Mais je viens de réaliser que ce n'est le cas qu'en local. En effet, la
compilation distance par distcc elle, n'utilise pas le cache de ccache,
tout au moins pour ce que je vois et ce que j'en comprends.
En plus clair, j'ai une machine A et une machine B, toutes les 2 avec
gentoo à jour, donc même gcc, distcc et ccache.
Si je lance une première compilation par emerge de firefox (une nouvelle
version jamais compilée sur aucune des machines) sur la machine A, le
ccache de la machine A va se "remplir", mais comme (à priori) le distcc
de la machine B ne fait pas appel à ccache, celui de B ne bougera pas.
Si ensuite, je lance cette même compilation de firefox sur la machine B,
je vais avoir le ccache de la machine B qui va se "remplir", mais celui
de la machine A ne sera pas utilisé puisque son distcc ne fait pas appel
à ccache.
Du coup, aucun des 2 ccaches n'aura été utile, et ne le sera jamais, sauf
si je recompile la même version de firefox.
Bon, je ne suis sûr de rien de ce que j'avance là, c'est juste pour
lancer la discussion et faire comprendre ou m'amène mon raisonnement.
Qu'en pensent les vrais connaisseurs ?
Ai-je raison ?
Est-ce un fonctionnement normal parce que pour une raison qui m'échappe
ça doit fonctionner comme ça ?
Et dans le cas contraire, que faut-il changer à la configuration de distcc
pour qu'il exploite ccache, si possible à la méthode gentoo ?
Parce que je lis bien un truc sur le sujet dans le man de distcc, mais
déjà je n'y comprends pas grand chose, mais en plus, je ne vois pas
comment ça s'adapterait à la sauce gentoo. Et mes recherches sur le net
sur le sujet ne donnent pas grand chose.
NB : je ne cherche pas à faire l'usine à gaz qui consisterait à avoir un
ccache commun à toutes les machines dans lequel taperaient toutes les
compilations. Je voudrais juste que lorsque distcc délègue une tache N à
une machine, celle-ci exploite son ccache.
Logiquement, le mieux serait de déclarer "ccache gcc" comme compilateur
dans la config de distcc sur les deux machines. Ainsi les compilations
locales seraient systématiquement cachées de part et d'autre. Bon, je
pense que ça ne coûte rien d'essayer :)
Par contre, dans l'autre sens, si tu utilises ccache pour piloter distcc,
alors le cache de la machine initiant la compilation contient le résultat
de la compilation pour tous les hôtes distcc. Il me semble délicat de
cumuler les deux modes, à moins de stocker le cache dans un partage NFS.
--
Question: How does a large software project get to be one year late?
Answer: One day at a time!
Fred Brooks
C'est ce qu'il faudrait que je trouve...
Effectivement, le man parle de quelque chose du genre, mais comme je
l'avais dit, je n'avais pas bien capté le sens. Je vais revoir ça.
A priori ce n'était pas le but. Et c'est justement la partie dans le man
qui me laisse(ait) perplexe.
Sinon, personne n'a d'à-priori contre cette solution ? Pas de
ralentissement/effet inverse à l'effet souhaité à craindre ? Hors tests
spécifiques, ce n'est pas souvent facile de se rendre compte de
l'efficacité de ce type de montage.
J'ai donc tenté de rajouter (machine B)
DISTCC_CC="ccache gcc"
dans /etc/env.d/02distcc
qui est bien pris en compte puisque
# distcc-config --get-env CC
CCÌache gcc
Sur la machine A, je lance :
FEATURES="-ccache" emerge subversion
(le FEATURES me permet d'enlever la fonctionnalité ccache en local sans
quoi il n'est jamais fait appel à distcc puisque tout est en cache).
Je constate bien les appels à distcc sur la machine B, mais le ccache -s
ne montre aucune modification. J'en déduis que ça ne fait pas appel à
ccache distant.
Ça ne me semble pas évident.
Si on utilise ccache à l'intérieur de distcc, ccache va cacher sur chaque
machine les fichiers qui y sont compilés. Comme il n'y a pas de garanties
que ce soient les mêmes d'une compilation à l'autre, l'efficacité du cache
s'en trouve amoindrie.
Au contraire, si on utilise distcc à l'intérieur de ccache, au contraire, le
cache garde toute son efficacité, mais seule la compilation est distribuée,
pas le travail de ccache lui-même. L'un dans l'autre je soupçonne que c'est
plus efficace.
Si ce n'est pas indiscret, quel genre de tâche demande des compilations
répétées ainsi ?
C'est un peu l'orientation de discussion que je cherchais.
Oh non, rien de particulier. Juste Gentoo qui compile tout (pour mon
bonheur). Et donc quand je mets à jour 5 machines avec chacune firefox,
j'aurais préféré que ça aille un peu plus vite sur chacune en mutualisant
un peu plus (si rentable) le travail de chacune pour les autres.
C'est pour ça que je ne cherche cette solution QUE dans le cadre de
l'utilisation de portage/emerge.
Si les machines utilisent les mêmes options de compilation, autant copier
les binaires résultant de la compilation. Si elles n'utilisent pas les mêmes
options, le cache ne servira à rien. Je pense que tu perds un peu ton temps
sur ce point.
le 20/08/2013 à 17:32, Nicolas George a écrit dans le message
+1
À l'époque où j'utilisais Gentoo, j'utilisais uniquement la machine la plus
puissante pour compiler et distribuer les binaires ; voir
--
Benoit Izac
Je suis aussi de cet avis. ccache n'accélèrera que certaines
_re_compilations (genre sans doute après un 'revdep-rebuild' ou un
'emerge @preserved-rebuild'), et sera donc souvent inutile (il provoque
même parfois des problèmes de compilation). Un peu de lecture (en
anglais) d'un dev gentoo :
https://blog.flameeyes.eu/2008/06/debunking-ccache-myths
D'ailleurs, la doc officielle avait été modifiée notamment suite à cette
discussion : https://bugs.gentoo.org/show_bug.cgi?id27945
Désormais, elle parle de ccache comme d'une fonctionnalité s'adressant
surtout aux développeurs :
http://www.gentoo.org/doc/fr/handbook/handbook-x86.xml?part=2&chap=3#doc_chap3
T.