Objet : Pour les administrateurs de serveurs de listes utilisant le logiciel Sympa
Archives de la liste
- From: Roland Touchais <adresse@cachée>
- To: adresse@cachée
- Subject: [resume] envoi a 600 sur 4000 abonnes
- Date: Tue, 25 Sep 2001 10:55:01 +0200 (MET DST)
Voici la conclusion de moon probleme, merci a Olivier Salaün pour
ses pistes vers la solution.
mon probleme etait :
> j'utilise la derniere version de sympa 3.2.1
> configure pour ne pas utiliser les databases.
>
> j'exploite plusieurs dizaines de listes avec
> moin de 500 abonnes fixes sans aucun probleme.
>
> je genere une liste de 4000 abonnes (mailing interne,
> pas du SPAM), et la sympa semble bien fonctionner
> mais n'envoie qu'aux 500 a 800 premiers abonnes...
la piste de Olivier Salaün a ete :
> Jette un coup d'oeil à la doc de DB_File (perldoc DB_File) ;
> essaie d'étendre la quntité de mémoire utilisable (bsize,cachesize,...)
Avant tout, mon probleme est exclusivent pour ceux manipulant des
listes d'utilisateurs dans des fichiers. Si vos utilisateurs sont
dans un SGBD, ceci ne vous concerne probablement pas.
Pour comprendre ce qui se passe il faut savoir que sympa, si l'on utilise
des fichiers a plat pour les listes d'abonnes, commence par charger
en memoire la liste avant de l'exploiter. Ce chargement en memoire se
fait en deux temps :
1) constitution d'une liste perl par lecture du fichier.
2) contitution d'une base Berkeley DB2 en mememoire par parcour de
la liste PERL.
Cette seconde etape est assuree par la fonction List::_load_users.
Ce qu'il faut egalement savoir c'est que cette constitution de base DB2
est faite par l'intermediaire d'un "tie" qui "masque" l'usage de la base
DB2. L'affectation dans le HASH %users est donc en fait un put dans la
base associee.
Autre element, le put dans une base DB2 passe par un cache en memoire,
cache qui est normalement vide sur disque quand il devient trop plein.
Et donc l'utilisateur n'as donc normalement pas trop a se soucier de ce
cache. Mais dans le cas de sympa, la DB2 est utilisee exclusivement
en memoire et donc n'as aucun fichier disque associe. En consequence,
si le cache est plein, l'ecriture sur disque semble echouer avec un
"acces refuse"(errno pas teste par sympa), et dont toute nouvelle
affectation a %users ne se fait pas. Donc tous les abonnes d'une liste
doivent tenir dans le cahce en memoire.
Ce probleme est de plus asez difficile a cerner car les librairies DB2
adaptent la taille de ce cache en fonction des circonstances (j'ai fais
des essais de la fonction List::_load_users hors de sympa sans rencontrer
de probleme). C'est donc uniquement compte tenu des differents usages de
sympa, que DB2 se trouve parfois avec un cache trop petit.
J'ai donc apporte quelques petites modifications de secour a la fonction
_load_users pour essayer de fournir un cache toujours bien dimensionne.
(il serait sans doute preferable d'avoir un dimensionnement garanti
ou bien un paranetre de configuration dans sympa.conf ou par liste
dans expl/*/config...)
-------------------- ma fonction _load_users dans List.pm --------------------
sub _load_users {
my $file = shift;
do_log('debug2', 'List::_load_users(%s)', $file);
## Create the in memory btree using DB_File.
my %users;
my @users_list = (&_load_users_file($file)) ; ###!!!
my $btree = new DB_File::BTREEINFO;
return undef unless ($btree);
$btree->{'compare'} = '_compare_addresses';
$btree->{'cachesize'} = 200 * ( $#users_list + 1 ) ; ###!!!
my $ref = tie %users, 'DB_File', undef, O_CREAT|O_RDWR, 0600, $btree;
return undef unless ($ref);
## Counters.
my $total = 0;
foreach my $user ( @users_list ) { ###!!!
my $email = $user->{'email'};
unless ($users{$email}) {
$total++;
$users{$email} = join("\n", %{$user});
if ( ! defined ( $users{$email} )) { ###!!!
# $btree->{'cachesize'} sous dimensionne ###!!!
print STDERR "_load_users : cachesise too small " . ###!!!
": ($total users)\n" ###!!!
if $main::options{'debug'}; ###!!!
return ( undef ) ; ###!!!
} ###!!!
}
}
my $l = {
'ref' => $ref,
'users' => \%users,
'total' => $total
};
$l;
}
-------------------------------------------------------------------------
Roland Touchais
Ingenieur du Centre de Ressources Informatiques
Bat 210, Universite Paris-Sud, Orsay, France
tel: +33 1 69 15 72 26 fax: +33 1 69 15 69 86
email: adresse@cachée
- [resume] envoi a 600 sur 4000 abonnes, Roland Touchais, 25/09/2001
Archives gérées par MHonArc 2.6.19+.