[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 03/11] Improve accuracy of block migration bandwidth
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PATCH 03/11] Improve accuracy of block migration bandwidth calculation |
Date: |
Wed, 27 Apr 2011 15:43:02 +0200 |
From: Avishay Traeger <address@hidden>
block_mig_state.total_time is currently the sum of the read request
latencies. This is not very accurate because block migration uses aio and
so several requests can be submitted at once. Bandwidth should be computed
with wall-clock time, not by adding the latencies. In this case,
"total_time" has a higher value than it should, and so the computed
bandwidth is lower than it is in reality. This means that migration can
take longer than it needs to.
However, we don't want to use pure wall-clock time here. We are computing
bandwidth in the asynchronous phase, where the migration repeatedly wakes
up and sends some aio requests. The computed bandwidth will be used for
synchronous transfer.
Signed-off-by: Avishay Traeger <address@hidden>
Reviewed-by: Michael Roth <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block-migration.c | 23 +++++++++++------------
1 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/block-migration.c b/block-migration.c
index 576e55a..8d06a23 100644
--- a/block-migration.c
+++ b/block-migration.c
@@ -62,7 +62,6 @@ typedef struct BlkMigBlock {
QEMUIOVector qiov;
BlockDriverAIOCB *aiocb;
int ret;
- int64_t time;
QSIMPLEQ_ENTRY(BlkMigBlock) entry;
} BlkMigBlock;
@@ -78,6 +77,7 @@ typedef struct BlkMigState {
int prev_progress;
int bulk_completed;
long double total_time;
+ long double prev_time_offset;
int reads;
} BlkMigState;
@@ -131,12 +131,6 @@ uint64_t blk_mig_bytes_total(void)
return sum << BDRV_SECTOR_BITS;
}
-static inline void add_avg_read_time(int64_t time)
-{
- block_mig_state.reads++;
- block_mig_state.total_time += time;
-}
-
static inline long double compute_read_bwidth(void)
{
assert(block_mig_state.total_time != 0);
@@ -191,13 +185,14 @@ static void alloc_aio_bitmap(BlkMigDevState *bmds)
static void blk_mig_read_cb(void *opaque, int ret)
{
+ long double curr_time = qemu_get_clock_ns(rt_clock);
BlkMigBlock *blk = opaque;
blk->ret = ret;
- blk->time = qemu_get_clock_ns(rt_clock) - blk->time;
-
- add_avg_read_time(blk->time);
+ block_mig_state.reads++;
+ block_mig_state.total_time += (curr_time -
block_mig_state.prev_time_offset);
+ block_mig_state.prev_time_offset = curr_time;
QSIMPLEQ_INSERT_TAIL(&block_mig_state.blk_list, blk, entry);
bmds_set_aio_inflight(blk->bmds, blk->sector, blk->nr_sectors, 0);
@@ -250,7 +245,9 @@ static int mig_save_device_bulk(Monitor *mon, QEMUFile *f,
blk->iov.iov_len = nr_sectors * BDRV_SECTOR_SIZE;
qemu_iovec_init_external(&blk->qiov, &blk->iov, 1);
- blk->time = qemu_get_clock_ns(rt_clock);
+ if (block_mig_state.submitted == 0) {
+ block_mig_state.prev_time_offset = qemu_get_clock_ns(rt_clock);
+ }
blk->aiocb = bdrv_aio_readv(bs, cur_sector, &blk->qiov,
nr_sectors, blk_mig_read_cb, blk);
@@ -409,7 +406,9 @@ static int mig_save_device_dirty(Monitor *mon, QEMUFile *f,
blk->iov.iov_len = nr_sectors * BDRV_SECTOR_SIZE;
qemu_iovec_init_external(&blk->qiov, &blk->iov, 1);
- blk->time = qemu_get_clock_ns(rt_clock);
+ if (block_mig_state.submitted == 0) {
+ block_mig_state.prev_time_offset =
qemu_get_clock_ns(rt_clock);
+ }
blk->aiocb = bdrv_aio_readv(bmds->bs, sector, &blk->qiov,
nr_sectors, blk_mig_read_cb, blk);
--
1.7.2.3
- [Qemu-devel] [PULL 00/11] Block patches, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 02/11] atapi: Add 'medium ready' to 'medium not ready' transition on cd change, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 01/11] qemu-img: allow rebase to a NULL backing file when unsafe, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 03/11] Improve accuracy of block migration bandwidth calculation,
Kevin Wolf <=
- [Qemu-devel] [PATCH 06/11] ide/atapi: Use table instead of switch for commands, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 05/11] ide/atapi: Factor commands out, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 08/11] ide/atapi: Introduce CHECK_READY flag for commands, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 04/11] ide: Split atapi.c out, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 11/11] Remove obsolete 'enabled' variable from progress state, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 07/11] ide/atapi: Replace bdrv_get_geometry calls by s->nb_sectors, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 09/11] qed: Fix consistency check on 32-bit hosts, Kevin Wolf, 2011/04/27
- [Qemu-devel] [PATCH 10/11] Add dd-style SIGUSR1 progress reporting, Kevin Wolf, 2011/04/27
- Re: [Qemu-devel] [PULL 00/11] Block patches, Aurelien Jarno, 2011/04/27