From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41539) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCqDv-0007PM-Qc for qemu-devel@nongnu.org; Tue, 14 Jun 2016 11:25:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bCqDr-0003UY-4t for qemu-devel@nongnu.org; Tue, 14 Jun 2016 11:25:51 -0400 Received: from mailhub.sw.ru ([195.214.232.25]:39136 helo=relay.sw.ru) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bCqDq-0003Tm-Ll for qemu-devel@nongnu.org; Tue, 14 Jun 2016 11:25:47 -0400 From: "Denis V. Lunev" Date: Tue, 14 Jun 2016 18:25:12 +0300 Message-Id: <1465917916-22348-6-git-send-email-den@openvz.org> In-Reply-To: <1465917916-22348-1-git-send-email-den@openvz.org> References: <1465917916-22348-1-git-send-email-den@openvz.org> Subject: [Qemu-devel] [PATCH 5/9] mirror: improve performance of mirroring of empty disk List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, qemu-block@nongnu.org Cc: vsementsov@virtuozzo.com, "Denis V. Lunev" , Stefan Hajnoczi , Fam Zheng , Kevin Wolf , Max Reitz , Jeff Cody , Eric Blake 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 Reviewed-by: Vladimir Sementsov-Ogievskiy CC: Stefan Hajnoczi CC: Fam Zheng CC: Kevin Wolf CC: Max Reitz CC: Jeff Cody CC: Eric Blake --- block/mirror.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index c2f8773..d8be80a 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -363,7 +363,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, @@ -399,12 +399,15 @@ 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); + io_sectors_acct = 0; break; case MIRROR_METHOD_DISCARD: mirror_do_zero_or_discard(s, sector_num, io_sectors, true); + io_sectors_acct = 0; break; default: abort(); @@ -412,7 +415,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