En quelques mots voici les problèmes que j’ai rencontrés, et la solution que j’ai fini par trouver.
Les symptômes
Un spamassassin qui tournait drôlement bien sur une grosse machine (Athlon 2,4GHz avec 2G de Ram) à été migré sur une machine virtuelle Xen avec 96Mo de Ram. Le trafic étant très faible, à peine quelques centaines de mail par jour récupérés pour moitié par fetchmail, la migration devait se dérouler sans accroc ! Seulement voilà, à peine quelques heures après la migration, des erreurs comme ça dans le paniclog d’exim (exim4 pour être précis) :
spam acl condition: error reading from spamd socket: Connection timed out
Google étant mon amis, je cherche mais ne trouve pas de solution, à première vue certains messages mettent 300 secondes à être scanné mais rien de plus. Avec spamassassin en debug et 1 seul fils, je découvre qu’au bout d’un temps plus ou moins court le spamd ne répond plus, une simple interrogations avec spamc peut rester bloquer jusqu’au CTRL+C salvateur (après plus de 10mins).
La solution
Après avoir tester plein de truc, après avoir épluché la doc de spamassassin, la solution est arrivé à travers l’option suivante :
lock_method flock
dans le local.cf
Et oui, en fait ce qui bloquait spamd c’était tout simplement un inter-bloquage sur la base de données Bayes (ou Bayesian) Je ne suis pas rentré dans le détaille, mais croisons les doigts, ça marche depuis 12h00 sans aucun problème.
Optimisons
avec sa-compile il est maintenant possible de compiler le perl pour n’avoir que du binaire natif, ça n’économise pas la ram, mais le CPU ;-) Pour l’activer, il faut décommenter une ligne dans
/etc/spamassassin/v320.pre
installer re2c
apt-get install re2c
et lancer sa-compile
sa-compile
cette dernière commande est à relancer à chaque mise à jour des règles
Autre point important, en ajoutant la configuration suivante dans le user_prefs :
bayes_auto_expire 0
et l’action suivante une fois par jour :
sa-learn --force-expire
on demande à spamassassin de ne pas recalculer les éléments qui doivent expirer de la base Bayesian à chaque lecture ou presque mais juste de le faire 1 fois par jour.
Merci d'avoir pris le temps de lire ce texte. Vous pouvez soutenir l'écriture de ces billets et la réalisation des livecoding par de nombreux moyens. Mais le plus beau moyen de me remercier est de simplement partager ce texte autour de vous.
Sauf mention contraire, tout le contenu de ce site est sous licence