[Dovecot] minimize mbox mdbox fragmentation

Stan Hoeppner stan at hardwarefreak.com
Thu Oct 21 21:45:00 EEST 2010


Timo Sirainen put forth on 10/21/2010 9:52 AM:
> On Wed, 2010-10-20 at 23:50 -0500, Stan Hoeppner wrote:
>>> Oh, interesting. I didn't know that was possible. And even better: Linux
>>> has fallocate() that can do it for other filesystems than just XFS. Or
>>> looks like it's only XFS and ext4 (ext3 doesn't support it). I don't
>>> know if other OSes support this. 
>> There exists posix_fallocate() which would widen the platforms that
>> would support this Timo. 
> 
> I know about posix_fallocate(), but that does a different thing. It
> would work only when this works:

Ahh, ok, didn't realize that it was different than the Linux specific call.

>> Maybe in future I could make mdbox
>>> support writing to files whose size has been preallocated by actually
>>> writing NUL bytes, but that requires some extra code.
> 
>>  You may also want to look at posix_fadvise()
>> as well (if you're not using it already) which might increase Dovecot's
>> overall disk performance a bit.
> 
> I once wrote a patch for that and asked if anyone could confirm if it
> made things worse or better, but no one ever did.
> http://dovecot.org/list/dovecot/2007-November/026819.html

I wasn't aware of this.  I don't really have the resources, skill set,
or time to test patches, or I'd do so. :(

>> NOTE: I don't believe fallocate() in either posix or linux only form
>> will actually accomplish decreased m[d]box file fragmentation.  I don't
>> believe it actually increases the file size on disk, i.e. physically
>> allocating additional free extents tailing the end of the file.
>> fallocate() is _speculative_ preallocation, which isn't what you want.
> 
> Why do you believe that? The man pages and everything tell me that it's
> about physical preallocation:
> 
>        fallocate  is  used  to  preallocate blocks to a file.  For filesystems
>        which support the fallocate system call, this is done quickly by  allo‐
>        cating blocks and marking them as uninitialized, requiring no IO to the
>        data blocks.  This is much faster than creating a file  by  filling  it
>        with zeros.
> 
> Also "du" shows that the file's size is actually the preallocated size.
> That's how I checked which filesystems supported it.
> 
> And I think Linux fallocate() with XFS internally does exactly what
> XFS_IOC_RESVSP does, which your quoted mail mentioned being about
> physical preallocation.

Well that's cool then.

>>>> I don't know if it changes anything in the sequence above, but Dovecot
>>>> uses mmap i/o. 
> 
> mmap is used only for index files, not for mdbox files.

Ahh, that's really good to know.  IIRC the comments for enabling mmap in
dovecot.conf don't state this.  I thus assumed enabling mmap was for all
files.

>> It would be beneficial I think if you'd sub to the xfs list Timo and
>> pick some brains.
> 
> Maybe, but there is still so much other stuff to do, like bug fixing. :)

Looks like you've got a handle on it.  Like I said, I know just enough
about this stuff to make me dangerous. ;)

-- 
Stan




More information about the dovecot mailing list