Re: [Qemu-devel] [PATCH][RFC] Use writeback caching by default with qcow
From:
Stefan Berger
Subject:
Re: [Qemu-devel] [PATCH][RFC] Use writeback caching by default with qcow2
Date:
Wed, 19 Nov 2008 17:27:48 -0500
> address@hidden > Sent by: address@hidden
> >
> qcow2 writes a cluster reference count on every cluster update. This
> causes performance to crater when using anything but cache=writeback.
> This is most noticeable when using savevm. Right now, qcow2
isn't a
> reliable format regardless of the type of cache your using because
> metadata is not updated in the correct order. Considering this,
I think
> it's somewhat reasonable to use writeback caching by default with
qcow2
> files.
>
> It at least avoids the massive performance regression for users until
we
> sort out the issues in qcow2.
I applied it and tried 'delvm', 'savevm' and 'loadvm'
and at least the performance problems went away. Thanks.
I see some other problems after restoring a VM and
X11 not responding to keyboard inputs or Linux not shutting down properly.
But these may be due to me making some experiments with the 'unreliable'
features of qcow2.
Stefan
>
> Regards,
>
> Anthony Liguori
> Index: vl.c
> ===================================================================
> --- vl.c (revision 5751)
> +++ vl.c (working copy)
> @@ -2225,7 +2225,7 @@
> unit_id = -1;
> translation = BIOS_ATA_TRANSLATION_AUTO;
> index = -1;
> - cache = 1;
> + cache = 3;
>
> if (machine->use_scsi) {
> type = IF_SCSI;
> @@ -2496,6 +2496,8 @@
> bdrv_flags |= BDRV_O_NOCACHE;
> else if (cache == 2) /* write-back */
> bdrv_flags |= BDRV_O_CACHE_WB;
> + else if (cache == 3) /* not specified */
> + bdrv_flags |= BDRV_O_CACHE_DEF;
> if (bdrv_open2(bdrv, file, bdrv_flags, drv) <
0 ||
> qemu_key_check(bdrv, file)) {
> fprintf(stderr, "qemu: could
not open disk image %s\n",
>
file);
> Index: qemu-doc.texi
> ===================================================================
> --- qemu-doc.texi (revision 5751)
> +++ qemu-doc.texi (working copy)
> @@ -289,6 +289,12 @@
> attempt to do disk IO directly to the guests memory. QEMU
may still perform
> an internal copy of the data.
>
> +Some block drivers perform badly with @option{cache=writethrough},
> most notably,
> +qcow2. If performance is more important than correctness,
> address@hidden should be used with qcow2. By default,
if
> no explicit
> +caching is specified for a qcow2 disk image, @option{cache=writeback}
will be
> +used. For all other disk types, @option{cache=writethrough}
is the default.
> +
> Instead of @option{-cdrom} you can use:
> @example
> qemu -drive file=file,index=2,media=cdrom
> Index: block-qcow2.c
> ===================================================================
> --- block-qcow2.c (revision 5751)
> +++ block-qcow2.c (working copy)
> @@ -189,6 +189,14 @@
> int len, i, shift, ret;
> QCowHeader header;
>
> + /* Performance is terrible right now with cache=writethrough
due mainly
> + * to reference count updates. If the user does
not explicitly specify
> + * a caching type, force to writeback caching.
> + */
> + if ((flags & BDRV_O_CACHE_DEF)) {
> + flags |= BDRV_O_CACHE_WB;
> + flags &= ~BDRV_O_CACHE_DEF;
> + }
> ret = bdrv_file_open(&s->hd, filename,
flags);
> if (ret < 0)
> return ret;
> Index: block.h
> ===================================================================
> --- block.h (revision 5751)
> +++ block.h (working copy)
> @@ -49,8 +49,9 @@
>
bdrv_file_open())
*/
> #define BDRV_O_NOCACHE 0x0020 /* do not use the
host page cache */
> #define BDRV_O_CACHE_WB 0x0040 /* use write-back
caching */
> +#define BDRV_O_CACHE_DEF 0x0080 /* use default caching */
>
> -#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB)
> +#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB
|
> BDRV_O_CACHE_DEF)
>
> void bdrv_info(void);
> void bdrv_info_stats(void);