From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com
Subject: [Qemu-devel] [RFC PATCH 00/16] qcow2: Delayed COW
Date: Tue, 18 Sep 2012 13:40:26 +0200 [thread overview]
Message-ID: <1347968442-8860-1-git-send-email-kwolf@redhat.com> (raw)
During the last few releases we have got rid of most of the overhead of
metadata writes during cluster allocation. What's left is the COW for
unaligned allocating write requests, and it's quite expensive.
In the general case, this cost cannot be avoided. However, if we're
lucky enough that before the next flush the data copied during COW
would be overwritten, we can do without the COW. Sequential writes
always overwrite the COW area at the end of the cluster immediately,
so delaying the COW a bit and cancelling it if it's overwritten is a
worthwhile optimisation.
The really interesting part of this series should be close to final;
however, you only see the improvements with the last patch applied,
which isn't quite correct yet. Doing it right requires some additional
refactoring, so I thought I'd get this out for a first round of review
before fixing it.
iozone results with and without this series show significant difference
for allocating writes:
random random
KB reclen write rewrite read reread read write
base 65536 8 1727 1945 12546 12539 2449 1836
patch 65536 8 1934 1949 12263 12521 2463 1796
base 1048576 256 22344 38437 105823 106135 37743 32167
patch 1048576 256 35989 38542 105231 105994 38301 33036
Kevin Wolf (16):
qcow2: Round QCowL2Meta.offset down to cluster boundary
qcow2: Introduce Qcow2COWRegion
qcow2: Allocate l2meta dynamically
qcow2: Drop l2meta.cluster_offset
qcow2: Allocate l2meta only for cluster allocations
qcow2: Enable dirty flag in qcow2_alloc_cluster_link_l2
qcow2: Factor out handle_dependencies()
qcow2: Reading from areas not in L2 tables yet
qcow2: Move COW and L2 update into own coroutine
qcow2: Delay the COW
qcow2: Add error handling to the l2meta coroutine
qcow2: Handle dependencies earlier
qcow2: Change handle_dependency to byte granularity
qcow2: Execute run_dependent_requests() without lock
qcow2: Cancel COW when overwritten
[BROKEN] qcow2: Overwrite COW and allocate new cluster at the same
time
block.c | 5 +
block/qcow2-cluster.c | 432 ++++++++++++++++++++++++++++++++++++++-----------
block/qcow2.c | 239 +++++++++++++++++++++++-----
block/qcow2.h | 153 +++++++++++++++++-
block_int.h | 3 +
5 files changed, 692 insertions(+), 140 deletions(-)
--
1.7.6.5
next reply other threads:[~2012-09-18 11:40 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-18 11:40 Kevin Wolf [this message]
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 01/16] qcow2: Round QCowL2Meta.offset down to cluster boundary Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 02/16] qcow2: Introduce Qcow2COWRegion Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 03/16] qcow2: Allocate l2meta dynamically Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 04/16] qcow2: Drop l2meta.cluster_offset Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 05/16] qcow2: Allocate l2meta only for cluster allocations Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 06/16] qcow2: Enable dirty flag in qcow2_alloc_cluster_link_l2 Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 07/16] qcow2: Factor out handle_dependencies() Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 08/16] qcow2: Reading from areas not in L2 tables yet Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 09/16] qcow2: Move COW and L2 update into own coroutine Kevin Wolf
2012-09-18 14:24 ` Paolo Bonzini
2012-09-18 14:44 ` Kevin Wolf
2012-09-18 14:59 ` Paolo Bonzini
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 10/16] qcow2: Delay the COW Kevin Wolf
2012-09-18 14:27 ` Paolo Bonzini
2012-09-18 14:49 ` Kevin Wolf
2012-09-19 18:47 ` Blue Swirl
2012-09-20 6:58 ` Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 11/16] qcow2: Add error handling to the l2meta coroutine Kevin Wolf
2012-09-18 14:29 ` Paolo Bonzini
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 12/16] qcow2: Handle dependencies earlier Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 13/16] qcow2: Change handle_dependency to byte granularity Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 14/16] qcow2: Execute run_dependent_requests() without lock Kevin Wolf
2012-09-18 14:33 ` Paolo Bonzini
2012-09-18 14:54 ` Kevin Wolf
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 15/16] qcow2: Cancel COW when overwritten Kevin Wolf
2012-09-18 14:44 ` Paolo Bonzini
2012-09-18 15:02 ` Kevin Wolf
2012-09-18 15:05 ` Paolo Bonzini
2012-09-18 15:08 ` Paolo Bonzini
2012-09-18 11:40 ` [Qemu-devel] [RFC PATCH 16/16] [BROKEN] qcow2: Overwrite COW and allocate new cluster at the same time Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1347968442-8860-1-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).