Re: posix_fadvise noreuse disables file caching

看板FB_current作者時間14年前 (2012/01/30 02:01), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/9 (看更多)
--nextPart4901043.djbVi398T5 Content-Type: Text/Plain; charset="iso-8859-15" Content-Transfer-Encoding: quoted-printable On Wednesday 25 January 2012 17:29:22 John Baldwin wrote: > On Friday, January 20, 2012 2:12:13 pm John Baldwin wrote: >> On Thursday, January 19, 2012 11:39:42 am Tijl Coosemans wrote: >>> I recently noticed that multimedia/vlc generates a lot of disk IO when >>> playing media files. For instance, when playing a 320kbps mp3 gstat >>> reports about 1250kBps (=3D10000kbps). That's quite a lot of overhead. >>>=20 >>> It turns out that vlc sets POSIX_FADV_NOREUSE on the entire file and >>> reads in chunks of 1028 bytes. FreeBSD implements NOREUSE as if >>> O_DIRECT was specified during open(2), i.e. it disables all caching. >>> That means every 1028 byte read turns into a 32KiB read (new default >>> block size in 9.0) which explains the above numbers. >>>=20 >>> I've copied the relevant vlc code below (modules/access/file.c:Open()). >>> It's interesting to see that on OSX it sets F_NOCACHE which disables >>> caching too, but combined with F_RDAHEAD there's still read-ahead >>> caching. >>>=20 >>> I don't think POSIX intended for NOREUSE to mean O_DIRECT. It should >>> still cache data (and even do read-ahead if F_RDAHEAD is specified), >>> and once data is fetched from the cache, it can be marked WONTNEED. >>=20 >> POSIX doesn't specify O_DIRECT, so it's not clear what it asks for. >>=20 >>> Is it possible to implement it this way, or if not to just ignore >>> the NOREUSE hint for now? >>=20 >> I think it would be good to improve NOREUSE, though I had sort of >> assumed that applications using NOREUSE would do their own buffering >> and read full blocks. We could perhaps reimplement NOREUSE by doing >> the equivalent of POSIX_FADV_DONTNEED after each read to free buffers >> and pages after the data is copied out to userland. I also have an >> XXX about whether or not NOREUSE should still allow read-ahead as it >> isn't very clear what the right thing to do there is. HP-UX (IIRC) >> has an fadvise() that lets you specify multiple policies, so you >> could specify both NOREUSE and SEQUENTIAL for a single region to >> get read-ahead but still release memory once the data is read once. > > So I've came up with this untested patch. It uses > VOP_ADVISE(FADV_DONTNEED) after read(2) calls to a NOREUSE region, and > leaves read-ahead caching enabled for NOREUSE. FADV_DONTNEED doesn't > do any good really for writes (it only flushes clean buffers), so I've > left write(2) operations as using IO_DIRECT still. Does this sound > reasonable? I've not yet tested this at all: The patch drastically improves vlc, but there's still a tiny overhead. Without NOREUSE the disk is read in chunks of 128KiB (F_RDAHEAD buffer size). With NOREUSE there's an extra transfer of 32KiB (block size). --nextPart4901043.djbVi398T5 Content-Type: application/pgp-signature; name=signature.asc Content-Description: This is a digitally signed message part. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.18 (FreeBSD) iF4EABEIAAYFAk8lYOAACgkQfoCS2CCgtivk2AD/RqvjPc4BSLqq/BzerszDDolM cwQBJoh2eMsxfpiJroMA/2pRubGDhtqL3nG7zIYfgm/2fcH2LYFm7W9ZrUCLxTgD =VmXF -----END PGP SIGNATURE----- --nextPart4901043.djbVi398T5--
文章代碼(AID): #1F9ObVst (FB_current)
討論串 (同標題文章)
文章代碼(AID): #1F9ObVst (FB_current)