From: Anton Nefedov <anton.nefedov@virtuozzo.com>
To: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: "qemu-block@nongnu.org" <qemu-block@nongnu.org>,
"kwolf@redhat.com" <kwolf@redhat.com>,
"mreitz@redhat.com" <mreitz@redhat.com>,
"eblake@redhat.com" <eblake@redhat.com>,
Denis Lunev <den@virtuozzo.com>,
"berto@igalia.com" <berto@igalia.com>,
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
Anton Nefedov <anton.nefedov@virtuozzo.com>
Subject: [Qemu-devel] [PATCH v11 00/10] qcow2: cluster space preallocation
Date: Tue, 18 Dec 2018 07:57:25 +0000 [thread overview]
Message-ID: <20181218075707.12006-1-anton.nefedov@virtuozzo.com> (raw)
new in v11:
- patch 4, 9: fixed commentary format
- patch 4: removed one hunk with a dead check
- patch 5: added commentary to BDRV_REQ_ALLOCATE definition
- new auxiliary patch 6 for the following patch-7 change:
- patch 7: reset BDRV_REQ_ALLOCATE from supported flag if CONFIG_FALLOCATE
is false
- patch 9: add commentary about missing qcow2_pre_write_overlap_check().
Omit redundant changes in the test 060.
v10: http://lists.nongnu.org/archive/html/qemu-devel/2018-12/msg00121.html
- patches 1-3,6,7: rebase after REQ_WRITE_UNCHANGED
- patch 3: drop supported_zero_flags. My bad, no write_zeroes in quorum.
- patch 4: almost trivial rebase. RB-tags not stripped.
Choose another constant for BDRV_REQ_ALLOCATE
- patch 5: rebase. Instead of marking REQ_ALLOCATE serialising, accompany
it with REQ_SERIALISING.
- patch 7: add symmetric copy-on-read change
- patch 8: trivial rebase. RB-tags not stripped.
----
This pull request is to start to improve a few performance points of
qcow2 format:
1. non cluster-aligned write requests (to unallocated clusters) explicitly
pad data with zeroes if there is no backing data.
Resulting increase in ops number and potential cluster fragmentation
(on the host file) is already solved by:
ee22a9d qcow2: Merge the writing of the COW regions with the guest data
However, in case of zero COW regions, that can be avoided at all
but the whole clusters are preallocated and zeroed in a single
efficient write_zeroes() operation
2. moreover, efficient write_zeroes() operation can be used to preallocate
space megabytes (*configurable number) ahead which gives noticeable
improvement on some storage types (e.g. distributed storage)
where the space allocation operation might be expensive)
(Not included in this patchset since v6).
3. this will also allow to enable simultaneous writes to the same unallocated
cluster after the space has been allocated & zeroed but before
the first data is written and the cluster is linked to L2.
(Not included in this patchset).
Efficient write_zeroes usually implies that the blocks are not actually
written to but only reserved and marked as zeroed by the storage.
In this patchset, file-posix driver is marked as supporting this operation
if it supports (/configured to support) fallocate() operation.
Existing bdrv_write_zeroes() falls back to writing zero buffers if
write_zeroes is not supported by the driver.
A new flag (BDRV_REQ_ALLOCATE) is introduced to avoid that but return ENOTSUP.
Such allocate requests are also implemented to possibly overlap with the
other requests. No wait is performed but an error returned in such case as well.
So the operation should be considered advisory and a fallback scenario still
handled by the caller (in this case, qcow2 driver).
simple perf test:
qemu-img create -f qcow2 test.img 4G && \
qemu-img bench -c $((1024*1024)) -f qcow2 -n -s 4k -t none -w test.img
test results (seconds):
+-----------+-------+------+-------+------+------+
| file | before | after | gain |
+-----------+-------+------+-------+------+------+
| ssd | 61.153 | 36.313 | 41% |
| hdd | 112.676 | 122.056 | -8% |
+-----------+--------------+--------------+------+
Anton Nefedov (10):
mirror: inherit supported write/zero flags
blkverify: set supported write/zero flags
quorum: set supported write flags
block: introduce BDRV_REQ_ALLOCATE flag
block: treat BDRV_REQ_ALLOCATE as serialising
file-posix: reset fallocate-related flags without CONFIG_FALLOCATE*
file-posix: support BDRV_REQ_ALLOCATE
block: support BDRV_REQ_ALLOCATE in passthrough drivers
qcow2: skip writing zero buffers to empty COW areas
iotest 134: test cluster-misaligned encrypted write
qapi/block-core.json | 4 +-
block/qcow2.h | 6 +++
include/block/block.h | 13 +++++-
include/block/block_int.h | 3 +-
block/blkdebug.c | 2 +-
block/blkverify.c | 10 ++++-
block/copy-on-read.c | 4 +-
block/file-posix.c | 16 +++++--
block/io.c | 45 +++++++++++++++----
block/mirror.c | 8 +++-
block/qcow2-cluster.c | 2 +-
block/qcow2.c | 89 +++++++++++++++++++++++++++++++++++++-
block/quorum.c | 19 +++++++-
block/raw-format.c | 2 +-
block/trace-events | 1 +
tests/qemu-iotests/060 | 7 ++-
tests/qemu-iotests/060.out | 5 ++-
tests/qemu-iotests/134 | 9 ++++
tests/qemu-iotests/134.out | 10 +++++
19 files changed, 227 insertions(+), 28 deletions(-)
--
2.17.1
next reply other threads:[~2018-12-18 7:57 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-18 7:57 Anton Nefedov [this message]
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 01/10] mirror: inherit supported write/zero flags Anton Nefedov
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 02/10] blkverify: set " Anton Nefedov
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 03/10] quorum: set supported write flags Anton Nefedov
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 04/10] block: introduce BDRV_REQ_ALLOCATE flag Anton Nefedov
2018-12-20 15:09 ` Vladimir Sementsov-Ogievskiy
2019-01-07 14:22 ` Alberto Garcia
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 05/10] block: treat BDRV_REQ_ALLOCATE as serialising Anton Nefedov
2019-01-07 15:19 ` Alberto Garcia
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 06/10] file-posix: reset fallocate-related flags without CONFIG_FALLOCATE* Anton Nefedov
2018-12-21 13:51 ` Vladimir Sementsov-Ogievskiy
2019-01-07 15:22 ` Alberto Garcia
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 07/10] file-posix: support BDRV_REQ_ALLOCATE Anton Nefedov
2018-12-21 14:18 ` Vladimir Sementsov-Ogievskiy
2019-01-07 15:24 ` Alberto Garcia
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 08/10] block: support BDRV_REQ_ALLOCATE in passthrough drivers Anton Nefedov
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 09/10] qcow2: skip writing zero buffers to empty COW areas Anton Nefedov
2018-12-21 16:16 ` Vladimir Sementsov-Ogievskiy
2018-12-24 8:21 ` Anton Nefedov
2018-12-24 8:33 ` Vladimir Sementsov-Ogievskiy
2019-01-08 13:40 ` Alberto Garcia
2018-12-18 7:57 ` [Qemu-devel] [PATCH v11 10/10] iotest 134: test cluster-misaligned encrypted write Anton Nefedov
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=20181218075707.12006-1-anton.nefedov@virtuozzo.com \
--to=anton.nefedov@virtuozzo.com \
--cc=berto@igalia.com \
--cc=den@virtuozzo.com \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.com \
/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).