[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v3 14/23] qemu-img: Speed up compare on pre-allocate
From: |
Eric Blake |
Subject: |
[Qemu-block] [PATCH v3 14/23] qemu-img: Speed up compare on pre-allocated larger file |
Date: |
Thu, 13 Jul 2017 10:47:02 -0500 |
Compare the following images with all-zero contents:
$ truncate --size 1M A
$ qemu-img create -f qcow2 -o preallocation=off B 1G
$ qemu-img create -f qcow2 -o preallocation=metadata C 1G
On my machine, the difference is noticeable for pre-patch speeds,
with more than an order of magnitude in difference caused by the
choice of preallocation in the qcow2 file:
$ time ./qemu-img compare -f raw -F qcow2 A B
Warning: Image size mismatch!
Images are identical.
real 0m0.014s
user 0m0.007s
sys 0m0.007s
$ time ./qemu-img compare -f raw -F qcow2 A C
Warning: Image size mismatch!
Images are identical.
real 0m0.341s
user 0m0.144s
sys 0m0.188s
Why? Because bdrv_is_allocated() returns false for image B but
true for image C, throwing away the fact that both images know
via lseek(SEEK_HOLE) that the entire image still reads as zero.
>From there, qemu-img ends up calling bdrv_pread() for every byte
of the tail, instead of quickly looking for the next allocation.
The solution: use block_status instead of is_allocated, giving:
$ time ./qemu-img compare -f raw -F qcow2 A C
Warning: Image size mismatch!
Images are identical.
real 0m0.014s
user 0m0.011s
sys 0m0.003s
which is on par with the speeds for no pre-allocation.
Signed-off-by: Eric Blake <address@hidden>
---
v3: new patch
---
qemu-img.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/qemu-img.c b/qemu-img.c
index bc21d00..46f9da5 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1471,11 +1471,11 @@ static int img_compare(int argc, char **argv)
while (sector_num < progress_base) {
int64_t count;
- ret = bdrv_is_allocated_above(blk_bs(blk_over), NULL,
+ ret = bdrv_block_status_above(blk_bs(blk_over), NULL,
sector_num * BDRV_SECTOR_SIZE,
(progress_base - sector_num) *
BDRV_SECTOR_SIZE,
- &count);
+ &count, NULL);
if (ret < 0) {
ret = 3;
error_report("Sector allocation test failed for %s",
@@ -1483,11 +1483,11 @@ static int img_compare(int argc, char **argv)
goto out;
}
- /* TODO relax this once bdrv_is_allocated_above does not enforce
+ /* TODO relax this once bdrv_block_status_above does not enforce
* sector alignment */
assert(QEMU_IS_ALIGNED(count, BDRV_SECTOR_SIZE));
nb_sectors = count >> BDRV_SECTOR_BITS;
- if (ret) {
+ if (ret & BDRV_BLOCK_ALLOCATED && !(ret & BDRV_BLOCK_ZERO)) {
nb_sectors = MIN(nb_sectors, IO_BUF_SIZE >> BDRV_SECTOR_BITS);
ret = check_empty_sectors(blk_over, sector_num, nb_sectors,
filename_over, buf1, quiet);
--
2.9.4
- [Qemu-block] [PATCH v3 05/23] block: Switch bdrv_make_zero() to byte-based, (continued)
- [Qemu-block] [PATCH v3 05/23] block: Switch bdrv_make_zero() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 06/23] qemu-img: Switch get_block_status() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 04/23] qcow2: Switch is_zero_sectors() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 07/23] block: Convert bdrv_get_block_status() to bytes, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 08/23] block: Switch bdrv_co_get_block_status() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 09/23] block: Switch BdrvCoGetBlockStatusData to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 10/23] block: Switch bdrv_common_block_status_above() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 11/23] block: Switch bdrv_co_get_block_status_above() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 12/23] block: Convert bdrv_get_block_status_above() to bytes, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 13/23] qemu-img: Simplify logic in img_compare(), Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 14/23] qemu-img: Speed up compare on pre-allocated larger file,
Eric Blake <=
- [Qemu-block] [PATCH v3 15/23] qemu-img: Add find_nonzero(), Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 16/23] qemu-img: Drop redundant error message in compare, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 17/23] qemu-img: Change check_empty_sectors() to byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 18/23] qemu-img: Change compare_sectors() to be byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 19/23] qemu-img: Change img_rebase() to be byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 20/23] qemu-img: Change img_compare() to be byte-based, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 21/23] block: Align block status requests, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 22/23] block: Relax bdrv_aligned_preadv() assertion, Eric Blake, 2017/07/13
- [Qemu-block] [PATCH v3 23/23] qemu-io: Relax 'alloc' now that block-status doesn't assert, Eric Blake, 2017/07/13