J’ai décidé d’utiliser une distribution Gentoo avec un noyau OpenVZ, hébergeant des VPS eux aussi sous Gentoo.
L’utilisation d’une distribution Gentoo sur un serveur animé par un petit Celeron 1.2 GHz pose quelques soucis de temps d’installation / mise à jour des paquets. Ceci est d’autant pire qu’il faut multiplier ce temps par le nombre de VPS…
ccache est un cache de compilateur, qui permet d’accélérer notablement les recompilations futures de sources identiques. Ceci est déjà fort appréciable pour accélérer les recompilations lors du changement de certains use flags.
Partager le cache entre les VPS
Afin d’éviter de recompiler les même paquets sur chacun des VPS, j’ai décidé de partager le cache de ccache via NFS (comme je le fais pour l’arbre de paquets Gentoo par exemple).
Sur l’hôte
J’utilise donc le serveur NFS déjà configuré sur l’hôte OpenVZ :
mkdir -p /var/tmp/ccache
echo "/var/tmp/ccache 10.0.0.0/255.255.255.0(async,rw,no_subtree_check,insecure,no_root_squash)" >> /etc/exports
exports -r
Sur les VPS
Il suffit d’installer ccache et d’utiliser le partage NFS comme répertoire de cache :
emerge ccache
echo "host:/var/tmp/ccache /var/tmp/ccache nfs rw 0 0" >> /etc/fstab
mkdir /var/tmp/ccache
mount /var/tmp/ccachecd /var/tmp
mkdir ccache
chown portage:portage ccache
chmod 775 ccache
echo "CCACHE_DIR=\"/var/tmp/ccache\"" >> /etc/env.d/99local
env-update
source /etc/profile
Il ne reste alors plus qu’à configurer portage pour utiliser ccache, en ajoutant les lignes suivantes dans le fichier /etc/make.conf :
CCACHE_SIZE="4G"
CCACHE_DIR="/var/tmp/ccache"
CCACHE_COMPILERCHECK="content"
FEATURES="ccache"
La directive CCACHE_COMPILERCHECK permet d’indiquer a ccache d’utiliser le contenu du binaire GCC plutôt que sa date de modification pour identifier la version du compilateur. La configuration par défaut utilise la date de modification du fichier, qui sera forcément différente entre deux VPS utilisant pourtant la même version de GCC.
Contrairement à ce qu’affirme portage à la fin de l’installation de GCC, l’ajout de la variable FEATURES m’a été nécessaire pour qu’il utilise ccache…
Vérification
Il suffit maintenant de compiler le même paquet successivement sur deux VPS et de vérifier que ccache est bien utilisé sur le second.
Après la compilation sur le premier VPS :
web tmp # ccache -s cache directory /var/tmp/ccache cache hit 0 cache miss 31 called for link 1 autoconf compile/link 15 no input file 4 files in cache 62 cache size 168 Kbytes max cache size 4.0 Gbytes
Après la compilation sur le second VPS (qui a du être beaucoup plus rapide) :
web tmp # ccache -s cache directory /var/tmp/ccache cache hit 31 cache miss 31 called for link 5 not a C/C++ file 64 autoconf compile/link 45 unsupported compiler option 56 no input file 13 files in cache 62 cache size 168 Kbytes max cache size 4.0 Gbytes