[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v3 8/8] mirror: improve performance of mirroring of
From: |
Denis V. Lunev |
Subject: |
[Qemu-block] [PATCH v3 8/8] mirror: improve performance of mirroring of empty disk |
Date: |
Thu, 14 Jul 2016 16:33:29 +0300 |
We should not take into account zero blocks for delay calculations.
They are not read and thus IO throttling is not required. In the
other case VM migration with 16 Tb QCOW2 disk with 4 Gb of data takes
days.
Signed-off-by: Denis V. Lunev <address@hidden>
Reviewed-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
CC: Stefan Hajnoczi <address@hidden>
CC: Kevin Wolf <address@hidden>
CC: Max Reitz <address@hidden>
CC: Jeff Cody <address@hidden>
CC: Eric Blake <address@hidden>
---
block/mirror.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index ae70c3b..1787a6a 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -323,6 +323,7 @@ static uint64_t coroutine_fn
mirror_iteration(MirrorBlockJob *s)
int nb_chunks = 1;
int64_t end = s->bdev_length / BDRV_SECTOR_SIZE;
int sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
+ bool write_zeroes_ok = bdrv_can_write_zeroes_with_unmap(blk_bs(s->target));
sector_num = hbitmap_iter_next(&s->hbi);
if (sector_num < 0) {
@@ -373,7 +374,7 @@ static uint64_t coroutine_fn
mirror_iteration(MirrorBlockJob *s)
bitmap_set(s->in_flight_bitmap, sector_num / sectors_per_chunk, nb_chunks);
while (nb_chunks > 0 && sector_num < end) {
int ret;
- int io_sectors;
+ int io_sectors, io_sectors_acct;
BlockDriverState *file;
enum MirrorMethod {
MIRROR_METHOD_COPY,
@@ -410,12 +411,17 @@ static uint64_t coroutine_fn
mirror_iteration(MirrorBlockJob *s)
switch (mirror_method) {
case MIRROR_METHOD_COPY:
io_sectors = mirror_do_read(s, sector_num, io_sectors);
+ io_sectors_acct = io_sectors;
break;
case MIRROR_METHOD_ZERO:
- mirror_do_zero_or_discard(s, sector_num, io_sectors, false);
- break;
case MIRROR_METHOD_DISCARD:
- mirror_do_zero_or_discard(s, sector_num, io_sectors, true);
+ mirror_do_zero_or_discard(s, sector_num, io_sectors,
+ mirror_method == MIRROR_METHOD_DISCARD);
+ if (write_zeroes_ok) {
+ io_sectors_acct = 0;
+ } else {
+ io_sectors_acct = io_sectors;
+ }
break;
default:
abort();
@@ -423,7 +429,7 @@ static uint64_t coroutine_fn
mirror_iteration(MirrorBlockJob *s)
assert(io_sectors);
sector_num += io_sectors;
nb_chunks -= DIV_ROUND_UP(io_sectors, sectors_per_chunk);
- delay_ns += ratelimit_calculate_delay(&s->limit, io_sectors);
+ delay_ns += ratelimit_calculate_delay(&s->limit, io_sectors_acct);
}
return delay_ns;
}
--
2.5.0
- [Qemu-block] [PATCH v3 0/8] drive-mirror improvements, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 5/8] block: remove extra condition in bdrv_can_write_zeroes_with_unmap, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 6/8] mirror: optimize dirty bitmap filling in mirror_run a bit, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 1/8] dirty-bitmap: operate with int64_t amount, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 2/8] mirror: make sectors_in_flight int64_t, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 8/8] mirror: improve performance of mirroring of empty disk,
Denis V. Lunev <=
- [Qemu-block] [PATCH v3 3/8] mirror: create mirror_throttle helper, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 7/8] mirror: efficiently zero out target, Denis V. Lunev, 2016/07/14
- [Qemu-block] [PATCH v3 4/8] mirror: create mirror_dirty_init helper for mirror_run, Denis V. Lunev, 2016/07/14
- Re: [Qemu-block] [PATCH v3 0/8] drive-mirror improvements, Denis V. Lunev, 2016/07/18
- Re: [Qemu-block] [PATCH v3 0/8] drive-mirror improvements, Jeff Cody, 2016/07/19