Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Apr 2001 11:35:36 +0200
From:      Niek Bergboer <niek@wit379119.student.utwente.nl>
To:        Mike Silbersack <silby@silby.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: UFS block size vs. write speed
Message-ID:  <20010424113536.A61988@wit379119.student.utwente.nl>
In-Reply-To: <Pine.BSF.4.31.0104231207360.1931-100000@achilles.silby.com>; from silby@silby.com on Mon, Apr 23, 2001 at 12:09:26PM -0500
References:  <20010423134554.A57241@wit379119.student.utwente.nl> <Pine.BSF.4.31.0104231207360.1931-100000@achilles.silby.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Mon, Apr 23, 2001 at 12:09:26PM -0500, Mike Silbersack wrote:
> On Mon, 23 Apr 2001, Niek Bergboer wrote:
> > I've implemented a quick hack on the BSD ftp-client: in the original
> > recv-file function data is read from a socket into a buffer, which is
> > then written to a file. I've mmap-ed the file, and rather than reading
> > from the socket into the buffer, I read directly from the socket into
> > the mmaped region. I use the MAP_SHARED and MAP_NOSYNC flags, and
> > especially the latter makes a huge difference.
> 
> I seem to remember Matt Dillon saying that if you extend a file through
> mmap'd writes, it will become very fragmented.  Check the archives for
> this mailing list during decemeber or so, I believe the thread had
> something to so with usenet servers.

Yes, the file gets fragmented indeed because I first extend it using
ftruncate() and then mmap() it. The fragmentation gets especially bad
when the MAP_ASYNC flag is passed to mmap(). However, in order to get
a "write-cache"-like system I need to use MAP_ASYNC.

Now, what I'm wondering about is the following: when one uses
ftruncate() to extend a file, _no_ blocks get allocated in the
filesystem because all blocks are empty (it was nice to see that I was
actually able to make a 800 GB "file" on a 15 GB harddisk).

This non-allocation seems to be the problem: if more than one process
is writing, the blocks will have to be allocated dynamically as one
writes into the mmap()'ed area. So is it possible to _allocate_ the
blocks without actually _writing_ them full of zeros? If ftruncate()
can do this, you would only have to write a very small amount of
meta-data to the filesystem in order to allocate a non-fragmented set
of blocks.

In fact, I couldn't care less if the allocated blocks contain random
data (rather than zeros), since I'll be overwriting them immediately.

> Mike "Silby" Silbersack

Niek Bergboer
-- 
Conscience doth make cowards of us all.
                -- Shakespeare

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010424113536.A61988>