[Dovecot] mail_fsync=never doesn't work?
Attila Nagy
bra at fsn.hu
Mon Sep 27 22:13:25 EEST 2010
On 09/27/2010 04:52 PM, Timo Sirainen wrote:
> On Mon, 2010-09-27 at 16:31 +0200, Attila Nagy wrote:
>> doveconf -n:
>> mail_plugins = $mail_plugins quota
> One annoying problem about v2.0's doveconf -n output is that it hides
> when using multiple var=$var lines.. Did you have more plugins than just
> quota enabled?
Yes:
./20-lmtp.conf: mail_plugins = $mail_plugins mail_log notify
./10-mail.conf:mail_plugins = $mail_plugins quota
./20-pop3.conf: mail_plugins = $mail_plugins autocreate
./20-imap.conf: mail_plugins = $mail_plugins imap_quota autocreate
>> Should I set mail_fsync for only pop and imap instances? Currently I
>> don't use Dovecot's lmtp or deliver, but will, so there I can't allow
>> disabling fsync. I don't like setting this to never, but after a
>> migration from courier, the machine couldn't handle the load with fsync,
>> so this is a must.
> Yeah, either set it to only protocol imap/pop3 {} or alternatively put
> mail_fsync=no to protocol lda/lmtp {}.
That's what I want to do, when I'll start to use LMTP.
>> BTW, just curious, what is the rationale of the two fstats so close
>> together?
> It's because of how the code works internally. It would be too much
> trouble to avoid the second call and would make the code uglier. fstat()
> is cheap anyway.
Yes, 42 or 24 us according to the trace.
>> I've searched for some more examples and each of them were like this
>> one. It seems that Dovecot copies the subscriptions file to this
>> temporary file and then fsyncs it. And the question also arises: why?
> Fixed: http://hg.dovecot.org/dovecot-2.0/rev/4959db811d29
Thanks! But shouldn't "Avoid fsyncing subscriptions file when it doesn't
change or if mail_fsync=never." be "Avoid re-writing subscriptions file
when it doesn't change and fsyncing it if mail_fsync=never."?
I mean (I haven't read the code context) if you know that it does not
change, why write?
> Also http://hg.dovecot.org/dovecot-2.0/rev/432208994270 avoids multiple
> write() syscalls. Although it still does writes to temp file even when
> it's not necessary, but that's again annoyingly too much trouble to
> prevent..
Hmm. It may be trouble, but inspecting a user's pop3 login (no fsync
now) starting with the first appearance of subscription.lock, ending
with the last I see more weird stuff:
62900 pop3 1285613658.763692 NAMI
"/home/hm01/user2/Maildir/subscriptions.lock"
62900 pop3 1285613658.763777 RET lstat -1 errno 2 No such file
or directory
[...]
62900 pop3 1285613658.783839 CALL unlink(0x8010b0a40)
62900 pop3 1285613658.783865 NAMI
"/home/hm01/user2/Maildir/subscriptions.lock"
62900 pop3 1285613658.784045 RET unlink 0
I see four(!) rewrites of the subscriptions file between the two. And
also there is 20 ms in between, during that nothing happened, just
creating a temporary file, linking it to subscriptions.lock, reading
subscriptions, writing its conents to the temporary file, then deleting
both the temporary file and subscriptions.lock and this is four times.
(BTW, this is 20ms when virtually nobody uses the server, during the
peak I think it will be more)
Do you see the same, or is this just my config?
Even one unnecessary read&write (which makes a lot more file system
operations, so stresses the kernel in case of a lot of logins) can be
significant with a thousand of logins per second, not talking about four. :)
>> And more specifically: why in a pop3 server?
> Do you have autocreate plugin enabled with autosubscribe plugin
> settings? You didn't show your full doveconf output so I have to guess..
>
Sorry. Yes. Here's the full config:
# 2.0.4: /usr/local/etc/dovecot/dovecot.conf
# OS: FreeBSD 8.1-STABLE amd64
auth_cache_size = 104857600
auth_cache_ttl = 86400 s
disable_plaintext_auth = no
mail_fsync = never
mail_gid = 999
mail_location = maildir:~/Maildir
mail_plugins = $mail_plugins quota
mail_uid = 999
managesieve_notify_capability = mailto
managesieve_sieve_capability = fileinto reject envelope
encoded-character vacation subaddress comparator-i;ascii-numeric
relational regex imap4flags copy include variables body enotify
environment mailbox date
passdb {
args = /usr/local/etc/dovecot/dovecot-ldap.conf.ext
driver = ldap
}
plugin {
autocreate = INBOX.Trash
autocreate2 = INBOX.Drafts
autocreate3 = INBOX.Sent
autocreate4 = INBOX.Spam
autosubscribe = INBOX.Trash
autosubscribe2 = INBOX.Drafts
autosubscribe3 = INBOX.Sent
autosubscribe4 = INBOX.Spam
mail_log_events = delete undelete expunge copy mailbox_delete
mailbox_rename flag_change save mailbox_create
mail_log_fields = uid box msgid size flags vsize from subject
quota = maildir:User quota
}
protocols = pop3 imap lmtp
service auth {
unix_listener auth-userdb {
mode = 0600
user = qmailldap
}
}
service imap-login {
process_min_avail = 16
service_count = 0
}
service imap {
client_limit = 8
process_min_avail = 16
service_count = 0
}
service lmtp {
inet_listener lmtp {
port = 24
}
user = qmailldap
}
service pop3-login {
process_min_avail = 16
service_count = 0
}
service pop3 {
client_limit = 8
process_min_avail = 16
service_count = 0
}
ssl = no
userdb {
driver = prefetch
}
userdb {
args = /usr/local/etc/dovecot/dovecot-ldap.conf.ext
driver = ldap
}
protocol lmtp {
mail_plugins = $mail_plugins mail_log notify
}
protocol imap {
mail_max_userip_connections = 1024
mail_plugins = $mail_plugins imap_quota autocreate
}
protocol pop3 {
mail_max_userip_connections = 1024
mail_plugins = $mail_plugins autocreate
}
Thanks for the high quality support.
More information about the dovecot
mailing list