Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 4 Dec 1998 14:28:29 -0600 (CST)
From:      Kevin Day <toasty@home.dragondata.com>
To:        dillon@apollo.backplane.com (Matthew Dillon)
Cc:        hackers@FreeBSD.ORG
Subject:   Re: Nonblocking page fetching
Message-ID:  <199812042028.OAA25409@home.dragondata.com>
In-Reply-To: <199812041934.LAA16719@apollo.backplane.com> from Matthew Dillon at "Dec 4, 1998 11:34:35 am"

next in thread | previous in thread | raw e-mail | index | archive | help
> 
> :I have an application where I'm streaming large amounts of data from disk,
> :and throwing it on the screen. (Playing a movie, essentially). I'm mmapping
> :the region that i'm playing, and just start memcpy'ing each frame into the
> :renderer's buffer. This is very time critical, so running out of buffered
> :data isn't good.
> :
> :I needed a way to trick the kernel into bringing pages off of disk without
> :making my process block waiting for them. Essentially, if I'm playing frame
> :10, I'd better already have frames 10-15 in ram, and should start bringing
> :frame 16 in, while 10 is playing. (I tried keeping a 4-6 frame buffer)
> :...
> :
> :What would be very nice is a syscall that could tell the vm system that a
> :page will be needed shortly, so bring it in as soon as possible. Sort of
> :like madvising with WILL_NEED, but a much stronger hint.
> 
>     The facility already exists in the system.  In fact, it even exists in
>     -stable.
> 
>     mmap() the region as per normal.
> 
>     madvise() the region to be MADV_WILLNEED
>     madvise() the region to be MADV_SEQUENTIAL
> 
>     The kernel will read-ahead.  Now, it will not read-ahead quickly enough
>     to avoid blocking, but you may be able to tune the kernel specifically
>     to handle your situation.  Take a look at the code in vm/vm_fault.c,
>     around line 351.  Also look at the VM_FAULT_READ_AHEAD and
>     VM_FAULT_READ_BEHIND defines.
> 
>     The key to making this work in a full-streaming application is to
>     issue I/O for N pages ahead but to not fault-in one page in the center
>     of that group.  You then take a page fault when you hit that page, but
>     since it is in the buffer cache it doesn't block and the kernel takes
>     the opportunity to issue read-aheads for the next N pages (of which N/2
>     already probably in the buffer cache).  If you make N big enough, you
>     are all set.  

I tried this initially, and had a few problems:

        1) madvise seems slow
        2) I need a *huge* amount to be prefetched when we first start, but
the amount varies considerably from movie to movie. I need something tunable
on the fly. (N changes with use)


> 
>     Note, however, that disk I/O bandwidth is much less then memory bandwidth
>     and probably much less then video-write bandwidth.  If you have limited
>     memory to buffer the data, you *will* block at some point.

It's not so much bandwidth, but latency. My movie's bandwidth is much less
than the disk bandwidth, i just can never stop to wait for things to be
brought in.

Kevin

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?199812042028.OAA25409>