Subject: Re: RAW access to files
To: None <tech-kern@netbsd.org>
From: der Mouse <mouse@Rodents.Montreal.QC.CA>
List: tech-kern
Date: 12/12/2001 15:34:42
> I have some exeperience with very large apps, processing much more
> than 2^32 bits of data (think a linear pass over a terabyte or so,
> updating a one-gigabyte array as it goes).  There, we found a huge
> performance win from doing reads in 1 or 2 Mbyte blocks -- the size
> of the disk buffer-- and using POSIX aio() or real threads to
> schedule read-ahead of those 2mbyte chunks.  (At the time, this
> design forced a non-BSD solution.)

Was there some reason to not use a second process?  I once got fed up
with the way dd between two disks kept each disk busy only about half
the time and built a program that had a reader process and a writer
process, with blocks passed between them via shared memory (mmap
MAP_ANON|MAP_SHARED, fork, and you have shared memory that doesn't
stick around on exit the way a SV SHM segment does).  It helped; even
between two disks on the same SCSI chain, I saw significant overlap
(based on watching the disk lights).

> Mmap() was a nonstarter; the app didnt fit in physical memory anyway,
> nevermind the linear once-only pass.

But is there a reason you couldn't mmap each megabyte and MADV_WILLNEED
the pages before processing and unmapping the previous chunk?

Or does MADV_WILLNEED not trigger pageins?

> I didnt dare try an ffs with 1meg blocks and 128k fragments and
> 2-block readahead: would that have worked?

Ooo.  You're twisted.  I love it.

I just now tried it on a 100MB filesystem in a vnd and newfs cored on
me.  I'm going to investigate further.

/~\ The ASCII				der Mouse
\ / Ribbon Campaign
 X  Against HTML	       mouse@rodents.montreal.qc.ca
/ \ Email!	     7D C8 61 52 5D E7 2D 39  4E F1 31 3E E8 B3 27 4B