--On Donnerstag, 19. Juni 2003 16:56 Uhr -0400 Ken Murchison <[EMAIL PROTECTED]> wrote:
Has anyone found or written a tool to load test an IMAP server (Cyrus in particular) which simulates client (reader) traffic?
sorry for the late reply, but I don't remember any other answers, so I thought you might still be interested. A colleague and I have written a very, very rough Perl script that's supposed to do exactly that. I'm not sure how good a job of it it does ... anyway, I'm attaching it.
Cheers, Sebastian Hagedorn -- Sebastian Hagedorn M.A. - RZKR-R1 (Gebäude 52), Zimmer 18 Zentrum für angewandte Informatik - Universitätsweiter Service RRZK Universität zu Köln / Cologne University - Tel. +49-221-478-5587
#!/usr/bin/perl
package imap; use strict; use warnings; use Getopt::Long; use Term::ReadKey; use Cyrus::IMAP::Admin; my ($client, $user, $host, $mech) = (undef, 'cyrus', 'cyrus.rrz.uni-koeln.de', 'DIGEST-MD5'); my ($file, $rc, $newuser) = ('usernames', undef, undef); my $quota = 0; my $pwd = undef; my @connections = (); my @connusers = (); my $commandcount = 0; my $key; my $value; my @userlist; my $nc; my $max=10; my $result; my $resulttext; my $debug=0; GetOptions('host=s' => \$host, 'user=s' => \$user, 'mechanism=s' => \$mech, 'max=i' => \$max, 'file=s' => \$file, 'debug' => \$debug, 'quota=i' => \$quota); $max--; ReadMode 2; # Echo off print "Password for Cyrus: "; chop($pwd = <STDIN>); print "\n"; ReadMode 0; # $client = imapconnection->new; # printf "State: %d\n", $client->getstate; # print "imapconnection::state $imapconnection::state\n"; open (IN, $file) or die "$!"; @userlist = <IN>; $quota = scalar @userlist; # exit 0; while (1) { $nc = scalar (@connections); if ($nc <= $max) { if (($nc == 0) or (int(rand(1000)) < 80)) { AGAIN: $rc = int(rand $quota)+1; $newuser = $userlist[$rc]; chop $newuser; print "User: $newuser, now:", $nc+1, ", # of commands: $commandcount\n"; $result = openconn(); if (!$result) { print STDERR "Retrying ...\n"; redo AGAIN; } } } $rc = int(rand scalar(@connections)); $result = docommand ($rc); if (!$result) { splice (@connections, $rc, 1); splice (@connusers, $rc, 1); } } sub debugcomment { return unless $debug; my $comment = shift; my $number = shift; chomp $comment; if ($number > -1) { print "$comment, $connusers[$number]\n"; return; } print "$comment\n"; } sub docommand { my $cnum = shift; $commandcount++; # print "Connection number $cnum\n"; my $rand = int(rand(1000)); if ($rand < 950) { debugcomment ("Vor FETCH BODY", $cnum); ($result,$resulttext) = $connections[$cnum]->send('', '', 'FETCH 1:1 (BODY[1])'); if (!$result) { print "Result: $result, Text: $resulttext\n"; return 0; } return 1; } debugcomment ("Vor LOGOUT", $cnum); $connections[$cnum]->send('', '', 'LOGOUT'); return 0; } sub openconn { push @connections, Cyrus::IMAP::Admin->new($host); push @connusers, $newuser; debugcomment ("Vor authenticate", -1); $connections[$#connections]->authenticate('-mechanism' => $mech, '-user' => 'cyrus', '-authz' => $newuser, '-password' => $pwd ) or die "Authentication failed!: $!"; if ($connections[$#connections]->error) { print STDERR "Error: ", $connections[$#connections],"\n"; pop @connections; pop @connusers; return 0; } debugcomment ("Vor SELECT", $#connections); ($result,$resulttext) = $connections[$#connections]->send('', '', 'SELECT INBOX'); if (!$result) { print "Result: $result, Text: $resulttext\n"; return 0; } debugcomment ("Vor SEARCH", $#connections); ($result,$resulttext) = $connections[$#connections]->send('', '', 'UID SEARCH UNSEEN UNDELETED'); if (!$result) { print "Result: $result, Text: $resulttext\n"; return 0; } debugcomment ("Vor THREAD", $#connections); ($result,$resulttext) = $connections[$#connections]->send('', '', 'THREAD REFERENCES us-ascii ALL'); if (!$result) { print "Result: $result, Text: $resulttext\n"; return 0; } debugcomment ("Vor FETCH FLAGS", $#connections); ($result,$resulttext) = $connections[$#connections]->send('', '', 'FETCH 1:* (FLAGS RFC822.SIZE UID INTERNALDATE ENVELOPE BODYSTRUCTURE)'); if (!$result) { print "Result: $result, Text: $resulttext\n"; return 0; } return 1; }
pgp00000.pgp
Description: PGP signature