public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH][RFC] Use writeback caching by default with qcow2
@ 2008-11-19 20:24 Anthony Liguori
  2008-11-19 22:27 ` Stefan Berger
  2008-11-20  7:04 ` Thomas Mueller
  0 siblings, 2 replies; 6+ messages in thread
From: Anthony Liguori @ 2008-11-19 20:24 UTC (permalink / raw)
  To: qemu-devel@nongnu.org; +Cc: kvm-devel

[-- Attachment #1: Type: text/plain, Size: 567 bytes --]

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.

Regards,

Anthony Liguori

[-- Attachment #2: block-qcow2-default-caching.patch --]
[-- Type: text/x-patch, Size: 2769 bytes --]

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,
+@option{cache=writeback} 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);

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH][RFC] Use writeback caching by default with qcow2
  2008-11-19 20:24 [PATCH][RFC] Use writeback caching by default with qcow2 Anthony Liguori
@ 2008-11-19 22:27 ` Stefan Berger
  2008-11-20  7:04 ` Thomas Mueller
  1 sibling, 0 replies; 6+ messages in thread
From: Stefan Berger @ 2008-11-19 22:27 UTC (permalink / raw)
  To: qemu-devel; +Cc: kvm-devel

[-- Attachment #1: Type: text/plain, Size: 3981 bytes --]

> aliguori@linux.vnet.ibm.com 
> Sent by: qemu-devel-bounces+stefanb=us.ibm.com@nongnu.org
> 
> 
> 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,
> +@option{cache=writeback} 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);

[-- Attachment #2: Type: text/html, Size: 5702 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH][RFC] Use writeback caching by default with qcow2
  2008-11-19 20:24 [PATCH][RFC] Use writeback caching by default with qcow2 Anthony Liguori
  2008-11-19 22:27 ` Stefan Berger
@ 2008-11-20  7:04 ` Thomas Mueller
  2008-11-20  9:55   ` Avi Kivity
  1 sibling, 1 reply; 6+ messages in thread
From: Thomas Mueller @ 2008-11-20  7:04 UTC (permalink / raw)
  To: kvm; +Cc: qemu-devel

On Wed, 19 Nov 2008 14:24:53 -0600, Anthony Liguori wrote:

> 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.  

so you don't advise to use qcow2 as a VBD or what do you mean with "isn't 
reliable"?

or contrawise: on the other formats the metadata is updated in the 
correct order?


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH][RFC] Use writeback caching by default with qcow2
  2008-11-20  7:04 ` Thomas Mueller
@ 2008-11-20  9:55   ` Avi Kivity
  2008-11-20 15:53     ` walt
  0 siblings, 1 reply; 6+ messages in thread
From: Avi Kivity @ 2008-11-20  9:55 UTC (permalink / raw)
  To: Thomas Mueller; +Cc: kvm, qemu-devel

Thomas Mueller wrote:
>> 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.  
>>     
>
> so you don't advise to use qcow2 as a VBD or what do you mean with "isn't 
> reliable"?
>   

Right, qcow2 is both very slow with cache=writethrough (or off), and may 
corrupt itself if the host crashes at the wrong moment.

> or contrawise: on the other formats the metadata is updated in the 
> correct order?
>   

raw is the only format we're sure of.

-- 
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH][RFC] Use writeback caching by default with qcow2
  2008-11-20  9:55   ` Avi Kivity
@ 2008-11-20 15:53     ` walt
  2008-11-20 16:23       ` Thomas Mueller
  0 siblings, 1 reply; 6+ messages in thread
From: walt @ 2008-11-20 15:53 UTC (permalink / raw)
  To: kvm; +Cc: qemu-devel



On Thu, 20 Nov 2008, Avi Kivity wrote:

> Thomas Mueller wrote:
> > > 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.
> >
> > so you don't advise to use qcow2 as a VBD or what do you mean with "isn't
> > reliable"?
> >
>
> Right, qcow2 is both very slow with cache=writethrough (or off), and may
> corrupt itself if the host crashes at the wrong moment.
>
> > or contrawise: on the other formats the metadata is updated in the correct
> > order?
> >
>
> raw is the only format we're sure of.

With that in mind I converted my qcow2 image to raw, and I'm trying to use
that as a base image to create a new raw (writeable) image:

#qemu-img create -b vista.raw vista.delta
Formatting 'vista.delta', fmt=raw, backing_file=vista.raw, size=20971520 kB
qemu-img: Formatting or formatting option not supported for file format 'raw'

Doesn't that seem like a bug?  Do people just not use raw images in this
way?

Thanks.



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH][RFC] Use writeback caching by default with qcow2
  2008-11-20 15:53     ` walt
@ 2008-11-20 16:23       ` Thomas Mueller
  0 siblings, 0 replies; 6+ messages in thread
From: Thomas Mueller @ 2008-11-20 16:23 UTC (permalink / raw)
  To: kvm; +Cc: qemu-devel


>>
>> > or contrawise: on the other formats the metadata is updated in the
>> > correct order?
>> >
>> >
>> raw is the only format we're sure of.
> 
> With that in mind I converted my qcow2 image to raw, and I'm trying to
> use that as a base image to create a new raw (writeable) image:
> 
> #qemu-img create -b vista.raw vista.delta Formatting 'vista.delta',
> fmt=raw, backing_file=vista.raw, size=20971520 kB qemu-img: Formatting
> or formatting option not supported for file format 'raw'
> 
> Doesn't that seem like a bug?  Do people just not use raw images in this
> way?

you can only use a backing file with qcow2 IMHO. also snapshots (savevm/
loadvm) work only with qcow2. 

- Thomas


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-11-20 16:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-11-19 20:24 [PATCH][RFC] Use writeback caching by default with qcow2 Anthony Liguori
2008-11-19 22:27 ` Stefan Berger
2008-11-20  7:04 ` Thomas Mueller
2008-11-20  9:55   ` Avi Kivity
2008-11-20 15:53     ` walt
2008-11-20 16:23       ` Thomas Mueller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox