On Fri, Apr 20, 2001 at 05:54:26AM -0700, Alfred Perlstein wrote:
> > PS: The tests were already done with the fs mounted async. The
> > drive in question communicates at UDMA/33 on a PIIX4 controller in
> > an AMD K6/2 233 system.
> It's funny, but you have the ideal system for an interesting
> optimization I've always wanted to try.  Since you seem to be
> reading over the network, have you tried doing this, creating
> the file and then using ftruncate on it to extend it, then use
> mmap() and read directly from the socket into the mmap'd area.

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.

The files are read using FTP with a buffer size of 64 kb. They are
read from a Linux 2.4 machine with cartloads of memory and I make sure
the Linux box has the files cached in memory. The Linux machine is
connected to the same 100 MBit/FDX switch and network congestion is
virtually non-existant.

Because the FreeBSD machine (the K6/2 233) only has 64 MB of RAM,
I've made the files small (10 files of 4 MB each, and later 5 files of
8 MB each). 

The normal BSD ftp-client reads all the files a approx. 6.5 to 7
Mbyte/s and this speed is more or less constant for all the files. The
mmap-ed version of the ftp-client reads the first few files at 8 to
8.5 MByte/s after which the throughput collapses due to the limited
amount of memory available for caching. I've noticed that using
madvise() with MADV_WILLNEED or MADV_SEQUENTIAL does not make that
much of a difference.

Conclusion: using the mmap trick, the box displays the ugly "all your
system is one big write cache" Linux-behaviour ;) Until memory is full
that is, after which throutput becomes lousy (4.5 Mbyte/s).

> You may have to experiment with several different madvise() flags
> to get optimal performance.  Or you may discover that doing this
> "trick" actually makes performance worse because of the way 
> the trick screws with what the vm system expects.
> I think a combination of MADV_SEQUENTIAL and/or MADV_WILLNEED
> could do the trick.

See above.

Niek

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

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to