From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1L2tcS-0006zH-6M for qemu-devel@nongnu.org; Wed, 19 Nov 2008 15:25:48 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1L2tcP-0006yt-Ai for qemu-devel@nongnu.org; Wed, 19 Nov 2008 15:25:47 -0500 Received: from [199.232.76.173] (port=37847 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L2tcP-0006yq-7h for qemu-devel@nongnu.org; Wed, 19 Nov 2008 15:25:45 -0500 Received: from e1.ny.us.ibm.com ([32.97.182.141]:55767) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1L2tcP-0006XV-0l for qemu-devel@nongnu.org; Wed, 19 Nov 2008 15:25:45 -0500 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e1.ny.us.ibm.com (8.13.1/8.13.1) with ESMTP id mAJKOfOx003169 for ; Wed, 19 Nov 2008 15:24:41 -0500 Received: from d01av02.pok.ibm.com (d01av02.pok.ibm.com [9.56.224.216]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v9.1) with ESMTP id mAJKOuOD097300 for ; Wed, 19 Nov 2008 15:24:56 -0500 Received: from d01av02.pok.ibm.com (loopback [127.0.0.1]) by d01av02.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id mAJKObro016884 for ; Wed, 19 Nov 2008 15:24:37 -0500 Message-ID: <49247615.6050105@us.ibm.com> Date: Wed, 19 Nov 2008 14:24:53 -0600 From: Anthony Liguori MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------080509080700070703070206" Subject: [Qemu-devel] [PATCH][RFC] Use writeback caching by default with qcow2 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "qemu-devel@nongnu.org" Cc: kvm-devel This is a multi-part message in MIME format. --------------080509080700070703070206 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit 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 --------------080509080700070703070206 Content-Type: text/x-patch; name="block-qcow2-default-caching.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="block-qcow2-default-caching.patch" 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); --------------080509080700070703070206--