[Libguestfs] [PATCH nbdkit v2 4/4] cache: Implement cache-max-size and method of reclaiming space from the cache.
Richard W.M. Jones
rjones at redhat.com
Thu Jan 3 11:50:32 UTC 2019
On Wed, Jan 02, 2019 at 09:39:10PM -0600, Eric Blake wrote:
> > +The default thresholds are high 95% and low 80%. The thresholds are
> > +expressed as percentages of C<cache-max-size>, and may be greater than
> > +100.
>
> Do the thresholds support fractional percentages, like 90.5, or must
> they be integral? Should we enforce that low threshold < high
> threshold? What does it really mean to have a threshold > 100 - that we
> can never reach the high threshold?
We don't support fractional percentages, but we could do, although it
seems like a overengineering (what's the real difference between a
threshold of 50% and 50.1% ?!). We do enforce low < high. A
percentage > 100% just means that we have a higher threshold (eg.
low = 160%, high = 190% behaves the same if cache-max-size is halved).
In the next version I have clarified and simplified the wording in the
manual.
> > +/* Do we support reclaiming cache blocks? */
> > +#ifdef FALLOC_FL_PUNCH_HOLE
> > +#define HAVE_CACHE_RECLAIM 1
> > +#else
> > +#undef HAVE_CACHE_RECLAIM
> > +#endif
> > +
>
> Should the man page mention that max cache size can only be enforced
> with kernel support? Do we want to go further and probe whether
> FALLOC_FL_PUNCH_HOLE works on $TMPDIR? (Even if the kernel supports
> punching holes, there are some filesystems that don't).
I'll add it to the manual, but it seems irksome to actually test it at
run time ...
> > + cache_allocated = statbuf.st_blocks * UINT64_C(512);
>
> Is that calculation always going to be accurate, even when more
> disks/file systems move towards 4k minimum access?
My reading of stat(2) is st_blocks is always expressed in 512 byte
blocks, independent of the sector size.
> > + nbdkit_debug ("cache: reclaiming block %" PRIu64, reclaim_blk);
>
> Where does this prioritize clean blocks over dirty blocks? Or is the
> .pod change inaccurate given later changes to implementation?
Right, it doesn't. I'll fix the manual.
> > +#ifdef FALLOC_FL_PUNCH_HOLE
> > + if (fallocate (fd, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE,
> > + reclaim_blk * BLKSIZE, BLKSIZE) == -1) {
> > + nbdkit_error ("cache: reclaiming cache blocks: "
> > + "fallocate: FALLOC_FL_PUNCH_HOLE: %m");
> > + return;
> > + }
> > +#else
> > +#error "no implementation for punching holes"
>
> This #error should be unreachable, given the definition of
> HAVE_CACHE_RECLAIM based on FALLOC_FL_PUNCH_HOLE.
So I left this in, in case we change HAVE_CACHE_RECLAIM for
implementing hole punching on another platform but forget to update
this code.
> >> +static void
> >> +reclaim_any (void)
> >> +{
> >> + /* Find the next block in the cache. */
> >> + reclaim_blk = bitmap_next (&bm, reclaim_blk+1);
> >> + if (reclaim_blk == -1) /* wrap around */
> >> + reclaim_blk = bitmap_next (&bm, 0);
> >> +
> >> + reclaim_block ();
>
> Even when reclaiming any, should we try to prioritize blocks that are
> found in the LRU cache's bm[1] but not bm[0], as we do have at least
> that bit of knowledge about LRU patterns? Otherwise, this can end up
> claiming the most recently used block, if that happens to be the next
> block in our cycling through the entire cache. Or is that too much
> layering violation, where it would unnecessarily tie this code to the
> current lru implementation?
I think we'd end up needing 3 states. I'll add a to-do comment ...
Thanks,
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
More information about the Libguestfs
mailing list