qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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);

reply via email to

[Prev in Thread] Current Thread [Next in Thread]