madvise() vs posix_fadvise()

John Baldwin jhb at freebsd.org
Thu Apr 3 20:17:14 UTC 2014


On Thursday, April 03, 2014 3:10:49 pm Dmitry Sivachenko wrote:
> 
> On 03 апр. 2014 г., at 20:30, John Baldwin <jhb at FreeBSD.org> wrote:
> 
> > 
> > The latter.  It's sort of like a lazy O_DIRECT.  Each time you call write(2),
> > it tries to move any clean pages from your current sequentially written
> > stream from inactive to cache, so the pages won't move until a subsequent
> > write(2) after bufdaemon or the syncer actually forces them to be written.
> > Unfortunately, it is currently implemented by doing an internal
> > FADV_DONTNEED after each read() or write().  It would be better if it was
> > implemented as a callback when buffers are completed.
> 
> 
> 
> Sounds like FADV_NOREUSE should be befeficial for any log-writing program?
> (syslogd, apache, nginx, .....)

Well, it depends.  If you plan on reading the log files, then using NOREUSE
can potentially make that more expensive as the logs are more likely to be
out of RAM when you go to read them (even if you have free memory, mostly
because "cache" isn't perfect, at least in my experience).  OTOH, pagedaemon
(a part of the VM system) should generally pick the log pages to evict when
needed (and I believe it might do a better job of that in 10 than it did
previously).  I think if you know that the log files are kicking more useful
things out of RAM and you don't generally plan on reading them (note that
things like compressing them with gzip counts as reading), then FADV_NOREUSE
can work fine.

-- 
John Baldwin


More information about the freebsd-hackers mailing list