aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2015-07-13 13:13:17 +0200
committerKevin Wolf <kwolf@redhat.com>2016-06-08 10:21:09 +0200
commit83de9be0dc59439ec6f97f58c8e9015b4fdc3010 (patch)
treecbc458a208601fe3113bc8313f992204ddb03da0
parentd3199a31c7bc72f6bcecbb3ebcc16940a1721e10 (diff)
qemu-img bench: Implement -S (step size)
With this new option, qemu-img bench can be told to advance the current offset after each request by a different value than the buffer size. This is useful for controlling the conditions for cluster allocation in image formats (e.g. qcow2 cluster allocation with COW in front of the request, or COW areas that aren't overwritten immediately). Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Denis V. Lunev <den@openvz.org> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--qemu-img-cmds.hx4
-rw-r--r--qemu-img.c25
-rw-r--r--qemu-img.texi6
3 files changed, 27 insertions, 8 deletions
diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index 117d0f9264..05a2991787 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -10,9 +10,9 @@ STEXI
ETEXI
DEF("bench", img_bench,
- "bench [-c count] [-d depth] [-f fmt] [-n] [-o offset] [--pattern=pattern] [-q] [-s buffer_size] [-t cache] [-w] filename")
+ "bench [-c count] [-d depth] [-f fmt] [-n] [-o offset] [--pattern=pattern] [-q] [-s buffer_size] [-S step_size] [-t cache] [-w] filename")
STEXI
-@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [--pattern=@var{pattern}] [-q] [-s @var{buffer_size}] [-t @var{cache}] [-w] @var{filename}
+@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [--pattern=@var{pattern}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var{cache}] [-w] @var{filename}
ETEXI
DEF("check", img_check,
diff --git a/qemu-img.c b/qemu-img.c
index 480ef8dba3..c5e2638a5a 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3465,6 +3465,7 @@ typedef struct BenchData {
uint64_t image_size;
bool write;
int bufsize;
+ int step;
int nrreq;
int n;
uint8_t *buf;
@@ -3501,7 +3502,7 @@ static void bench_cb(void *opaque, int ret)
exit(EXIT_FAILURE);
}
b->in_flight++;
- b->offset += b->bufsize;
+ b->offset += b->step;
b->offset %= b->image_size;
}
}
@@ -3518,6 +3519,7 @@ static int img_bench(int argc, char **argv)
int64_t offset = 0;
size_t bufsize = 4096;
int pattern = 0;
+ size_t step = 0;
int64_t image_size;
BlockBackend *blk = NULL;
BenchData data = {};
@@ -3533,7 +3535,7 @@ static int img_bench(int argc, char **argv)
{"pattern", required_argument, 0, OPTION_PATTERN},
{0, 0, 0, 0}
};
- c = getopt_long(argc, argv, "hc:d:f:no:qs:t:w", long_options, NULL);
+ c = getopt_long(argc, argv, "hc:d:f:no:qs:S:t:w", long_options, NULL);
if (c == -1) {
break;
}
@@ -3601,6 +3603,20 @@ static int img_bench(int argc, char **argv)
bufsize = sval;
break;
}
+ case 'S':
+ {
+ int64_t sval;
+ char *end;
+
+ sval = qemu_strtosz_suffix(optarg, &end, QEMU_STRTOSZ_DEFSUFFIX_B);
+ if (sval < 0 || sval > INT_MAX || *end) {
+ error_report("Invalid step size specified");
+ return 1;
+ }
+
+ step = sval;
+ break;
+ }
case 't':
ret = bdrv_parse_cache_mode(optarg, &flags, &writethrough);
if (ret < 0) {
@@ -3651,15 +3667,16 @@ static int img_bench(int argc, char **argv)
.blk = blk,
.image_size = image_size,
.bufsize = bufsize,
+ .step = step ?: bufsize,
.nrreq = depth,
.n = count,
.offset = offset,
.write = is_write,
};
printf("Sending %d %s requests, %d bytes each, %d in parallel "
- "(starting at offset %" PRId64 ")\n",
+ "(starting at offset %" PRId64 ", step size %d)\n",
data.n, data.write ? "write" : "read", data.bufsize, data.nrreq,
- data.offset);
+ data.offset, data.step);
data.buf = blk_blockalign(blk, data.nrreq * data.bufsize);
memset(data.buf, pattern, data.nrreq * data.bufsize);
diff --git a/qemu-img.texi b/qemu-img.texi
index 9bffad226b..ccc0b519ba 100644
--- a/qemu-img.texi
+++ b/qemu-img.texi
@@ -131,14 +131,16 @@ Skip the creation of the target volume
Command description:
@table @option
-@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [--pattern=@var{pattern}] [-q] [-s @var{buffer_size}] [-t @var{cache}] [-w] @var{filename}
+@item bench [-c @var{count}] [-d @var{depth}] [-f @var{fmt}] [-n] [-o @var{offset}] [--pattern=@var{pattern}] [-q] [-s @var{buffer_size}] [-S @var{step_size}] [-t @var{cache}] [-w] @var{filename}
Run a simple sequential I/O benchmark on the specified image. If @code{-w} is
specified, a write test is performed, otherwise a read test is performed.
A total number of @var{count} I/O requests is performed, each @var{buffer_size}
bytes in size, and with @var{depth} requests in parallel. The first request
-starts at the position given by @var{offset}.
+starts at the position given by @var{offset}, each following request increases
+the current position by @var{step_size}. If @var{step_size} is not given,
+@var{buffer_size} is used for its value.
If @code{-n} is specified, the native AIO backend is used if possible. On
Linux, this option only works if @code{-t none} or @code{-t directsync} is