Rok,
> Well... that didn't work out as planned... the smtp server keeps
> deferring the email even though the system load is quite low and
> according to zabbix, an average of 99.24 instances of amavis is free in
> the last 12 hours (min is 95 and max is 100), the system load is 0.70...
> [...]
> I've changed the $log_level to 5 for the time being... Hopefully I'll be
> able to do some debugging today as the server isn't used as much due to
> the holiday...
I'm not aware that such behaviour has ever been reported, so I can only
guess.
Perhaps the first thing to verify is: try telneting (repeatedly) to
amavisd port and see if you always get a greeting message soon,
or are you stuck on most attempts.
Handling of accept(2) on sockets and locking/serialization is entirely
under control of a Net::Server module. Below is a patch to add logging
to Net/Server/PreForkSimple.pm, so that we could see at which point
a child process is stuck. These log lines would appear in the amavis
log at level 5, e.g.:
amavisd.conf:
$log_level = 5;
$DO_SYSLOG = 1;
$syslog_ident = 'amavis';
$syslog_facility = 'user';
syslog.conf:
user.notice /var/log/amavisd.log
user.info /var/log/amavisd-info.log
user.debug,mail.info /var/log/amavisd-debug.log
$ tail -f /var/log/amavisd-debug.log | fgrep 'Net::Server: accept:'
--- Net/Server/PreForkSimple.pm~ 2010-05-05 05:01:58.000000000 +0200
+++ Net/Server/PreForkSimple.pm 2010-11-02 12:40:11.000000000 +0100
@@ -248,24 +248,28 @@
### serialize the child accepts
if( $prop->{serialize} eq 'flock' ){
+ $self->log(4,"accept: waiting on a flock");
while (! flock($prop->{lock_fh}, Fcntl::LOCK_EX())) {
next if $! == EINTR;
$self->fatal("Couldn't get lock on file \"$prop->{lock_file}\" [$!]");
}
}elsif( $prop->{serialize} eq 'semaphore' ){
+ $self->log(4,"accept: waiting on a semaphore");
$prop->{sem}->op( 0, -1, IPC::SysV::SEM_UNDO() )
|| $self->fatal("Semaphore Error [$!]");
}elsif( $prop->{serialize} eq 'pipe' ){
+ $self->log(4,"accept: waiting on a pipe read");
scalar <_WAITING>; # read one line - kernel says who gets it
}
+ $self->log(4,"accept: lock acquired, doing an accept");
### now do the accept method
my $accept_val = $self->SUPER::accept();
-
+ $self->log(4,"accept: accept done, releasing a lock");
### unblock serialization
if( $prop->{serialize} eq 'flock' ){
flock($prop->{lock_fh}, Fcntl::LOCK_UN());
@@ -278,6 +282,7 @@
print _READY "Next!\n";
}
+ $self->log(4,"accept: lock released");
### return our success
return $accept_val;
One other thing you may try: replace the flock serialization on a
socket with a semaphore. It requires modules IPC::SysV and IPC::Semaphore.
To let amavisd use it, search for 'serialize' in amavisd and change:
serialize => 'flock', # flock, semaphore, pipe
into a:
serialize => 'semaphore',
On a normal system both mechanisms achieve the same and cost about
the same.
Mark
------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
AMaViS-user mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/amavis-user
Please visit http://www.ijs.si/software/amavisd/ regularly
For administrativa requests please send email to rainer at openantivirus dot
org