diff mbox

[4/5] qemu-img bench: Implement -S (step size)

Message ID 1464957021-3469-5-git-send-email-kwolf@redhat.com
State New
Headers show

Commit Message

Kevin Wolf June 3, 2016, 12:30 p.m. UTC
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>
---
 qemu-img-cmds.hx |  4 ++--
 qemu-img.c       | 25 +++++++++++++++++++++----
 qemu-img.texi    |  6 ++++--
 3 files changed, 27 insertions(+), 8 deletions(-)

Comments

Denis V. Lunev June 6, 2016, 10:03 a.m. UTC | #1
On 06/03/2016 03:30 PM, Kevin Wolf wrote:
> 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>
> ---
>   qemu-img-cmds.hx |  4 ++--
>   qemu-img.c       | 25 +++++++++++++++++++++----
>   qemu-img.texi    |  6 ++++--
>   3 files changed, 27 insertions(+), 8 deletions(-)
>
> diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
> index b9b521e..f5d0098 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] [-q] [-s buffer_size] [-t cache] [-w] filename")
> +    "bench [-c count] [-d depth] [-f fmt] [-n] [-o offset] [-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}] [-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}] [-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 fcac8b8..ff99181 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -3464,6 +3464,7 @@ typedef struct BenchData {
>       uint64_t image_size;
>       bool write;
>       int bufsize;
> +    int step;
>       int nrreq;
>       int n;
>       uint8_t *buf;
> @@ -3500,7 +3501,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;
>       }
>   }
> @@ -3516,6 +3517,7 @@ static int img_bench(int argc, char **argv)
>       int depth = 64;
>       int64_t offset = 0;
>       size_t bufsize = 4096;
> +    size_t step = 0;
>       int64_t image_size;
>       BlockBackend *blk = NULL;
>       BenchData data = {};
> @@ -3530,7 +3532,7 @@ static int img_bench(int argc, char **argv)
>               {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
>               {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;
>           }
> @@ -3598,6 +3600,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) {
> @@ -3637,15 +3653,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, 0, data.nrreq * data.bufsize);
> diff --git a/qemu-img.texi b/qemu-img.texi
> index c37380e..6b03d3f 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}] [-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}] [-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
Reviewed-by: Denis V. Lunev <den@openvz.org>
diff mbox

Patch

diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index b9b521e..f5d0098 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] [-q] [-s buffer_size] [-t cache] [-w] filename")
+    "bench [-c count] [-d depth] [-f fmt] [-n] [-o offset] [-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}] [-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}] [-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 fcac8b8..ff99181 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -3464,6 +3464,7 @@  typedef struct BenchData {
     uint64_t image_size;
     bool write;
     int bufsize;
+    int step;
     int nrreq;
     int n;
     uint8_t *buf;
@@ -3500,7 +3501,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;
     }
 }
@@ -3516,6 +3517,7 @@  static int img_bench(int argc, char **argv)
     int depth = 64;
     int64_t offset = 0;
     size_t bufsize = 4096;
+    size_t step = 0;
     int64_t image_size;
     BlockBackend *blk = NULL;
     BenchData data = {};
@@ -3530,7 +3532,7 @@  static int img_bench(int argc, char **argv)
             {"image-opts", no_argument, 0, OPTION_IMAGE_OPTS},
             {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;
         }
@@ -3598,6 +3600,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) {
@@ -3637,15 +3653,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, 0, data.nrreq * data.bufsize);
diff --git a/qemu-img.texi b/qemu-img.texi
index c37380e..6b03d3f 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}] [-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}] [-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