qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/9] simplebench improvements
@ 2021-03-23 13:47 Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 1/9] simplebench: bench_one(): add slow_limit argument Vladimir Sementsov-Ogievskiy
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz

Hi all!

Here are some improvements to simplebench lib, to support my
"qcow2: compressed write cache" series.

v3:
01: use simpler logic
02,04-06: add John's r-b
07: use BooleanOptionalAction and
    initial_run=args.initial_run
08: rewrite so that we have a new --drop-caches option

Vladimir Sementsov-Ogievskiy (9):
  simplebench: bench_one(): add slow_limit argument
  simplebench: bench_one(): support count=1
  simplebench/bench-backup: add --compressed option
  simplebench/bench-backup: add target-cache argument
  simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED
  simplebench/bench-backup: support qcow2 source files
  simplebench/bench-backup: add --count and --no-initial-run
  simplebench/bench-backup: add --drop-caches argument
  MAINTAINERS: update Benchmark util: add git tree

 MAINTAINERS                            |  1 +
 scripts/simplebench/bench-backup.py    | 95 +++++++++++++++++++++-----
 scripts/simplebench/bench_block_job.py | 42 +++++++++++-
 scripts/simplebench/simplebench.py     | 28 +++++++-
 4 files changed, 144 insertions(+), 22 deletions(-)

-- 
2.29.2



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH v3 1/9] simplebench: bench_one(): add slow_limit argument
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 2/9] simplebench: bench_one(): support count=1 Vladimir Sementsov-Ogievskiy
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz

Sometimes one of cells in a testing table runs too slow. And we really
don't want to wait so long. Limit number of runs in this case.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 scripts/simplebench/simplebench.py | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
index f61513af90..0a3035732c 100644
--- a/scripts/simplebench/simplebench.py
+++ b/scripts/simplebench/simplebench.py
@@ -19,9 +19,11 @@
 #
 
 import statistics
+import time
 
 
-def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
+def bench_one(test_func, test_env, test_case, count=5, initial_run=True,
+              slow_limit=100):
     """Benchmark one test-case
 
     test_func   -- benchmarking function with prototype
@@ -36,6 +38,8 @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
     test_case   -- test case - opaque second argument for test_func
     count       -- how many times to call test_func, to calculate average
     initial_run -- do initial run of test_func, which don't get into result
+    slow_limit  -- stop at slow run (that exceedes the slow_limit by seconds).
+                   (initial run is not measured)
 
     Returns dict with the following fields:
         'runs':     list of test_func results
@@ -53,11 +57,19 @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True):
 
     runs = []
     for i in range(count):
+        t = time.time()
+
         print('  #run {}'.format(i+1))
         res = test_func(test_env, test_case)
         print('   ', res)
         runs.append(res)
 
+        if time.time() - t > slow_limit:
+            print('    - run is too slow, stop here')
+            break
+
+    count = len(runs)
+
     result = {'runs': runs}
 
     succeeded = [r for r in runs if ('seconds' in r or 'iops' in r)]
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 2/9] simplebench: bench_one(): support count=1
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 1/9] simplebench: bench_one(): add slow_limit argument Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 3/9] simplebench/bench-backup: add --compressed option Vladimir Sementsov-Ogievskiy
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz, John Snow

statistics.stdev raises if sequence length is less than two. Support
that case by hand.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
---
 scripts/simplebench/simplebench.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
index 0a3035732c..27bc4d4715 100644
--- a/scripts/simplebench/simplebench.py
+++ b/scripts/simplebench/simplebench.py
@@ -83,7 +83,10 @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True,
             dim = 'seconds'
         result['dimension'] = dim
         result['average'] = statistics.mean(r[dim] for r in succeeded)
-        result['stdev'] = statistics.stdev(r[dim] for r in succeeded)
+        if len(succeeded) == 1:
+            result['stdev'] = 0
+        else:
+            result['stdev'] = statistics.stdev(r[dim] for r in succeeded)
 
     if len(succeeded) < count:
         result['n-failed'] = count - len(succeeded)
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 3/9] simplebench/bench-backup: add --compressed option
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 1/9] simplebench: bench_one(): add slow_limit argument Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 2/9] simplebench: bench_one(): support count=1 Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 4/9] simplebench/bench-backup: add target-cache argument Vladimir Sementsov-Ogievskiy
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz

Allow bench compressed backup.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 scripts/simplebench/bench-backup.py    | 55 ++++++++++++++++++--------
 scripts/simplebench/bench_block_job.py | 23 +++++++++++
 2 files changed, 62 insertions(+), 16 deletions(-)

diff --git a/scripts/simplebench/bench-backup.py b/scripts/simplebench/bench-backup.py
index 33a1ecfefa..72eae85bb1 100755
--- a/scripts/simplebench/bench-backup.py
+++ b/scripts/simplebench/bench-backup.py
@@ -23,7 +23,7 @@
 
 import simplebench
 from results_to_text import results_to_text
-from bench_block_job import bench_block_copy, drv_file, drv_nbd
+from bench_block_job import bench_block_copy, drv_file, drv_nbd, drv_qcow2
 
 
 def bench_func(env, case):
@@ -37,29 +37,41 @@ def bench_func(env, case):
 def bench(args):
     test_cases = []
 
-    sources = {}
-    targets = {}
-    for d in args.dir:
-        label, path = d.split(':')  # paths with colon not supported
-        sources[label] = drv_file(path + '/test-source')
-        targets[label] = drv_file(path + '/test-target')
+    # paths with colon not supported, so we just split by ':'
+    dirs = dict(d.split(':') for d in args.dir)
 
+    nbd_drv = None
     if args.nbd:
         nbd = args.nbd.split(':')
         host = nbd[0]
         port = '10809' if len(nbd) == 1 else nbd[1]
-        drv = drv_nbd(host, port)
-        sources['nbd'] = drv
-        targets['nbd'] = drv
+        nbd_drv = drv_nbd(host, port)
 
     for t in args.test:
         src, dst = t.split(':')
 
-        test_cases.append({
-            'id': t,
-            'source': sources[src],
-            'target': targets[dst]
-        })
+        if src == 'nbd' and dst == 'nbd':
+            raise ValueError("Can't use 'nbd' label for both src and dst")
+
+        if (src == 'nbd' or dst == 'nbd') and not nbd_drv:
+            raise ValueError("'nbd' label used but --nbd is not given")
+
+        if src == 'nbd':
+            source = nbd_drv
+        else:
+            source = drv_file(dirs[src] + '/test-source')
+
+        if dst == 'nbd':
+            test_cases.append({'id': t, 'source': source, 'target': nbd_drv})
+            continue
+
+        fname = dirs[dst] + '/test-target'
+        if args.compressed:
+            fname += '.qcow2'
+        target = drv_file(fname)
+        if args.compressed:
+            target = drv_qcow2(target)
+        test_cases.append({'id': t, 'source': source, 'target': target})
 
     binaries = []  # list of (<label>, <path>, [<options>])
     for i, q in enumerate(args.env):
@@ -106,6 +118,13 @@ def bench(args):
             elif opt.startswith('max-workers='):
                 x_perf['max-workers'] = int(opt.split('=')[1])
 
+        backup_options = {}
+        if x_perf:
+            backup_options['x-perf'] = x_perf
+
+        if args.compressed:
+            backup_options['compress'] = True
+
         if is_mirror:
             assert not x_perf
             test_envs.append({
@@ -117,7 +136,7 @@ def bench(args):
             test_envs.append({
                 'id': f'backup({label})\n' + '\n'.join(opts),
                 'cmd': 'blockdev-backup',
-                'cmd-options': {'x-perf': x_perf} if x_perf else {},
+                'cmd-options': backup_options,
                 'qemu-binary': path
             })
 
@@ -163,5 +182,9 @@ def __call__(self, parser, namespace, values, option_string=None):
     p.add_argument('--test', nargs='+', help='''\
 Tests, in form source-dir-label:target-dir-label''',
                    action=ExtendAction)
+    p.add_argument('--compressed', help='''\
+Use compressed backup. It automatically means
+automatically creating qcow2 target with
+lazy_refcounts for each test run''', action='store_true')
 
     bench(p.parse_args())
diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py
index 7332845c1c..08f86ed9c1 100755
--- a/scripts/simplebench/bench_block_job.py
+++ b/scripts/simplebench/bench_block_job.py
@@ -21,6 +21,7 @@
 
 import sys
 import os
+import subprocess
 import socket
 import json
 
@@ -77,11 +78,29 @@ def bench_block_job(cmd, cmd_args, qemu_args):
     return {'seconds': (end_ms - start_ms) / 1000000.0}
 
 
+def get_image_size(path):
+    out = subprocess.run(['qemu-img', 'info', '--out=json', path],
+                         stdout=subprocess.PIPE, check=True).stdout
+    return json.loads(out)['virtual-size']
+
+
 # Bench backup or mirror
 def bench_block_copy(qemu_binary, cmd, cmd_options, source, target):
     """Helper to run bench_block_job() for mirror or backup"""
     assert cmd in ('blockdev-backup', 'blockdev-mirror')
 
+    if target['driver'] == 'qcow2':
+        try:
+            os.remove(target['file']['filename'])
+        except OSError:
+            pass
+
+        subprocess.run(['qemu-img', 'create', '-f', 'qcow2',
+                        target['file']['filename'],
+                        str(get_image_size(source['filename']))],
+                       stdout=subprocess.DEVNULL,
+                       stderr=subprocess.DEVNULL, check=True)
+
     source['node-name'] = 'source'
     target['node-name'] = 'target'
 
@@ -106,6 +125,10 @@ def drv_nbd(host, port):
             'server': {'type': 'inet', 'host': host, 'port': port}}
 
 
+def drv_qcow2(file):
+    return {'driver': 'qcow2', 'file': file}
+
+
 if __name__ == '__main__':
     import sys
 
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 4/9] simplebench/bench-backup: add target-cache argument
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (2 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 3/9] simplebench/bench-backup: add --compressed option Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 5/9] simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED Vladimir Sementsov-Ogievskiy
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz, John Snow

Allow benchmark with different kinds of target cache.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
---
 scripts/simplebench/bench-backup.py    | 33 ++++++++++++++++++++------
 scripts/simplebench/bench_block_job.py | 10 +++++---
 2 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/scripts/simplebench/bench-backup.py b/scripts/simplebench/bench-backup.py
index 72eae85bb1..fbc85f266f 100755
--- a/scripts/simplebench/bench-backup.py
+++ b/scripts/simplebench/bench-backup.py
@@ -65,13 +65,26 @@ def bench(args):
             test_cases.append({'id': t, 'source': source, 'target': nbd_drv})
             continue
 
-        fname = dirs[dst] + '/test-target'
-        if args.compressed:
-            fname += '.qcow2'
-        target = drv_file(fname)
-        if args.compressed:
-            target = drv_qcow2(target)
-        test_cases.append({'id': t, 'source': source, 'target': target})
+        if args.target_cache == 'both':
+            target_caches = ['direct', 'cached']
+        else:
+            target_caches = [args.target_cache]
+
+        for c in target_caches:
+            o_direct = c == 'direct'
+            fname = dirs[dst] + '/test-target'
+            if args.compressed:
+                fname += '.qcow2'
+            target = drv_file(fname, o_direct=o_direct)
+            if args.compressed:
+                target = drv_qcow2(target)
+
+            test_id = t
+            if args.target_cache == 'both':
+                test_id += f'({c})'
+
+            test_cases.append({'id': test_id, 'source': source,
+                               'target': target})
 
     binaries = []  # list of (<label>, <path>, [<options>])
     for i, q in enumerate(args.env):
@@ -186,5 +199,11 @@ def __call__(self, parser, namespace, values, option_string=None):
 Use compressed backup. It automatically means
 automatically creating qcow2 target with
 lazy_refcounts for each test run''', action='store_true')
+    p.add_argument('--target-cache', help='''\
+Setup cache for target nodes. Options:
+   direct: default, use O_DIRECT and aio=native
+   cached: use system cache (Qemu default) and aio=threads (Qemu default)
+   both: generate two test cases for each src:dst pair''',
+                   default='direct', choices=('direct', 'cached', 'both'))
 
     bench(p.parse_args())
diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py
index 08f86ed9c1..8f8385ccce 100755
--- a/scripts/simplebench/bench_block_job.py
+++ b/scripts/simplebench/bench_block_job.py
@@ -115,9 +115,13 @@ def bench_block_copy(qemu_binary, cmd, cmd_options, source, target):
                             '-blockdev', json.dumps(target)])
 
 
-def drv_file(filename):
-    return {'driver': 'file', 'filename': filename,
-            'cache': {'direct': True}, 'aio': 'native'}
+def drv_file(filename, o_direct=True):
+    node = {'driver': 'file', 'filename': filename}
+    if o_direct:
+        node['cache'] = {'direct': True}
+        node['aio'] = 'native'
+
+    return node
 
 
 def drv_nbd(host, port):
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 5/9] simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (3 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 4/9] simplebench/bench-backup: add target-cache argument Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 6/9] simplebench/bench-backup: support qcow2 source files Vladimir Sementsov-Ogievskiy
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz, John Snow

We should not report success if there is an error in final event.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
---
 scripts/simplebench/bench_block_job.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py
index 8f8385ccce..71d2e489c8 100755
--- a/scripts/simplebench/bench_block_job.py
+++ b/scripts/simplebench/bench_block_job.py
@@ -70,6 +70,10 @@ def bench_block_job(cmd, cmd_args, qemu_args):
             vm.shutdown()
             return {'error': 'block-job failed: ' + str(e),
                     'vm-log': vm.get_log()}
+        if 'error' in e['data']:
+            vm.shutdown()
+            return {'error': 'block-job failed: ' + e['data']['error'],
+                    'vm-log': vm.get_log()}
         end_ms = e['timestamp']['seconds'] * 1000000 + \
             e['timestamp']['microseconds']
     finally:
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 6/9] simplebench/bench-backup: support qcow2 source files
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (4 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 5/9] simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 7/9] simplebench/bench-backup: add --count and --no-initial-run Vladimir Sementsov-Ogievskiy
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz, John Snow

Add support for qcow2 source. New option says to use test-source.qcow2
instead of test-source. Of course, test-source.qcow2 should be
precreated.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
---
 scripts/simplebench/bench-backup.py    | 5 +++++
 scripts/simplebench/bench_block_job.py | 7 ++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/scripts/simplebench/bench-backup.py b/scripts/simplebench/bench-backup.py
index fbc85f266f..a2120fcbf0 100755
--- a/scripts/simplebench/bench-backup.py
+++ b/scripts/simplebench/bench-backup.py
@@ -58,6 +58,8 @@ def bench(args):
 
         if src == 'nbd':
             source = nbd_drv
+        elif args.qcow2_sources:
+            source = drv_qcow2(drv_file(dirs[src] + '/test-source.qcow2'))
         else:
             source = drv_file(dirs[src] + '/test-source')
 
@@ -199,6 +201,9 @@ def __call__(self, parser, namespace, values, option_string=None):
 Use compressed backup. It automatically means
 automatically creating qcow2 target with
 lazy_refcounts for each test run''', action='store_true')
+    p.add_argument('--qcow2-sources', help='''\
+Use test-source.qcow2 images as sources instead of
+test-source raw images''', action='store_true')
     p.add_argument('--target-cache', help='''\
 Setup cache for target nodes. Options:
    direct: default, use O_DIRECT and aio=native
diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py
index 71d2e489c8..4f03c12169 100755
--- a/scripts/simplebench/bench_block_job.py
+++ b/scripts/simplebench/bench_block_job.py
@@ -88,6 +88,11 @@ def get_image_size(path):
     return json.loads(out)['virtual-size']
 
 
+def get_blockdev_size(obj):
+    img = obj['filename'] if 'filename' in obj else obj['file']['filename']
+    return get_image_size(img)
+
+
 # Bench backup or mirror
 def bench_block_copy(qemu_binary, cmd, cmd_options, source, target):
     """Helper to run bench_block_job() for mirror or backup"""
@@ -101,7 +106,7 @@ def bench_block_copy(qemu_binary, cmd, cmd_options, source, target):
 
         subprocess.run(['qemu-img', 'create', '-f', 'qcow2',
                         target['file']['filename'],
-                        str(get_image_size(source['filename']))],
+                        str(get_blockdev_size(source))],
                        stdout=subprocess.DEVNULL,
                        stderr=subprocess.DEVNULL, check=True)
 
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 7/9] simplebench/bench-backup: add --count and --no-initial-run
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (5 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 6/9] simplebench/bench-backup: support qcow2 source files Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 8/9] simplebench/bench-backup: add --drop-caches argument Vladimir Sementsov-Ogievskiy
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz

Add arguments to set number of test runs per table cell and to disable
initial run that is not counted in results.

It's convenient to set --count 1 --no-initial-run to fast run test
onece, and to set --count to some large enough number for good
precision of the results.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 scripts/simplebench/bench-backup.py | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/scripts/simplebench/bench-backup.py b/scripts/simplebench/bench-backup.py
index a2120fcbf0..092fed5816 100755
--- a/scripts/simplebench/bench-backup.py
+++ b/scripts/simplebench/bench-backup.py
@@ -155,7 +155,8 @@ def bench(args):
                 'qemu-binary': path
             })
 
-    result = simplebench.bench(bench_func, test_envs, test_cases, count=3)
+    result = simplebench.bench(bench_func, test_envs, test_cases,
+                               count=args.count, initial_run=args.initial_run)
     with open('results.json', 'w') as f:
         json.dump(result, f, indent=4)
     print(results_to_text(result))
@@ -211,4 +212,13 @@ def __call__(self, parser, namespace, values, option_string=None):
    both: generate two test cases for each src:dst pair''',
                    default='direct', choices=('direct', 'cached', 'both'))
 
+    p.add_argument('--count', type=int, default=3, help='''\
+Number of test runs per table cell''')
+
+    # BooleanOptionalAction helps to support --no-initial-run option
+    p.add_argument('--initial-run', action=argparse.BooleanOptionalAction,
+                   help='''\
+Do additional initial run per cell which doesn't count in result,
+default true''')
+
     bench(p.parse_args())
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 8/9] simplebench/bench-backup: add --drop-caches argument
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (6 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 7/9] simplebench/bench-backup: add --count and --no-initial-run Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-03-23 13:47 ` [PATCH v3 9/9] MAINTAINERS: update Benchmark util: add git tree Vladimir Sementsov-Ogievskiy
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz

Add an option to drop caches before each test run. It may probably
improve reliability of results when testing in cached mode.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 scripts/simplebench/bench-backup.py |  6 +++++-
 scripts/simplebench/simplebench.py  | 11 ++++++++++-
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/scripts/simplebench/bench-backup.py b/scripts/simplebench/bench-backup.py
index 092fed5816..5a0675c593 100755
--- a/scripts/simplebench/bench-backup.py
+++ b/scripts/simplebench/bench-backup.py
@@ -156,7 +156,8 @@ def bench(args):
             })
 
     result = simplebench.bench(bench_func, test_envs, test_cases,
-                               count=args.count, initial_run=args.initial_run)
+                               count=args.count, initial_run=args.initial_run,
+                               drop_caches=args.drop_caches)
     with open('results.json', 'w') as f:
         json.dump(result, f, indent=4)
     print(results_to_text(result))
@@ -221,4 +222,7 @@ def __call__(self, parser, namespace, values, option_string=None):
 Do additional initial run per cell which doesn't count in result,
 default true''')
 
+    p.add_argument('--drop-caches', action='store_true', help='''\
+Do "sync; echo 3 > /proc/sys/vm/drop_caches" before each test run''')
+
     bench(p.parse_args())
diff --git a/scripts/simplebench/simplebench.py b/scripts/simplebench/simplebench.py
index 27bc4d4715..8efca2af98 100644
--- a/scripts/simplebench/simplebench.py
+++ b/scripts/simplebench/simplebench.py
@@ -19,11 +19,17 @@
 #
 
 import statistics
+import subprocess
 import time
 
 
+def do_drop_caches():
+    subprocess.run('sync; echo 3 > /proc/sys/vm/drop_caches', shell=True,
+                   check=True)
+
+
 def bench_one(test_func, test_env, test_case, count=5, initial_run=True,
-              slow_limit=100):
+              slow_limit=100, drop_caches=False):
     """Benchmark one test-case
 
     test_func   -- benchmarking function with prototype
@@ -40,6 +46,7 @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True,
     initial_run -- do initial run of test_func, which don't get into result
     slow_limit  -- stop at slow run (that exceedes the slow_limit by seconds).
                    (initial run is not measured)
+    drop_caches -- drop caches before each run
 
     Returns dict with the following fields:
         'runs':     list of test_func results
@@ -53,6 +60,7 @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True,
     """
     if initial_run:
         print('  #initial run:')
+        do_drop_caches()
         print('   ', test_func(test_env, test_case))
 
     runs = []
@@ -60,6 +68,7 @@ def bench_one(test_func, test_env, test_case, count=5, initial_run=True,
         t = time.time()
 
         print('  #run {}'.format(i+1))
+        do_drop_caches()
         res = test_func(test_env, test_case)
         print('   ', res)
         runs.append(res)
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH v3 9/9] MAINTAINERS: update Benchmark util: add git tree
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (7 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 8/9] simplebench/bench-backup: add --drop-caches argument Vladimir Sementsov-Ogievskiy
@ 2021-03-23 13:47 ` Vladimir Sementsov-Ogievskiy
  2021-04-27  8:58 ` [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
  2021-05-04  8:59 ` Vladimir Sementsov-Ogievskiy
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-03-23 13:47 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, vsementsov, mreitz

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 9147e9a429..7d83d64d14 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2531,6 +2531,7 @@ Benchmark util
 M: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
 S: Maintained
 F: scripts/simplebench/
+T: git https://src.openvz.org/scm/~vsementsov/qemu.git simplebench
 
 QAPI
 M: Markus Armbruster <armbru@redhat.com>
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 0/9] simplebench improvements
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (8 preceding siblings ...)
  2021-03-23 13:47 ` [PATCH v3 9/9] MAINTAINERS: update Benchmark util: add git tree Vladimir Sementsov-Ogievskiy
@ 2021-04-27  8:58 ` Vladimir Sementsov-Ogievskiy
  2021-05-04  8:59 ` Vladimir Sementsov-Ogievskiy
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-04-27  8:58 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, mreitz, John Snow

kindly ping.

I probably can pull it as is when 6.0 finally released and new development phase opened..

Still, John, if you have some time for it, could you look through the changes and may be give missed r-bs?

changes v2->v3:
  
  https://patchew.org/QEMU/20210304101738.20248-1-vsementsov@virtuozzo.com/diff/20210323134734.72930-1-vsementsov@virtuozzo.com/

23.03.2021 16:47, Vladimir Sementsov-Ogievskiy wrote:
> Hi all!
> 
> Here are some improvements to simplebench lib, to support my
> "qcow2: compressed write cache" series.
> 
> v3:
> 01: use simpler logic
> 02,04-06: add John's r-b
> 07: use BooleanOptionalAction and
>      initial_run=args.initial_run
> 08: rewrite so that we have a new --drop-caches option
> 
> Vladimir Sementsov-Ogievskiy (9):
>    simplebench: bench_one(): add slow_limit argument
>    simplebench: bench_one(): support count=1
>    simplebench/bench-backup: add --compressed option
>    simplebench/bench-backup: add target-cache argument
>    simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED
>    simplebench/bench-backup: support qcow2 source files
>    simplebench/bench-backup: add --count and --no-initial-run
>    simplebench/bench-backup: add --drop-caches argument
>    MAINTAINERS: update Benchmark util: add git tree
> 
>   MAINTAINERS                            |  1 +
>   scripts/simplebench/bench-backup.py    | 95 +++++++++++++++++++++-----
>   scripts/simplebench/bench_block_job.py | 42 +++++++++++-
>   scripts/simplebench/simplebench.py     | 28 +++++++-
>   4 files changed, 144 insertions(+), 22 deletions(-)
> 


-- 
Best regards,
Vladimir


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH v3 0/9] simplebench improvements
  2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
                   ` (9 preceding siblings ...)
  2021-04-27  8:58 ` [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
@ 2021-05-04  8:59 ` Vladimir Sementsov-Ogievskiy
  10 siblings, 0 replies; 12+ messages in thread
From: Vladimir Sementsov-Ogievskiy @ 2021-05-04  8:59 UTC (permalink / raw)
  To: qemu-block; +Cc: qemu-devel, den, mreitz

23.03.2021 16:47, Vladimir Sementsov-Ogievskiy wrote:
> Hi all!
> 
> Here are some improvements to simplebench lib, to support my
> "qcow2: compressed write cache" series.
> 
> v3:
> 01: use simpler logic
> 02,04-06: add John's r-b
> 07: use BooleanOptionalAction and
>      initial_run=args.initial_run
> 08: rewrite so that we have a new --drop-caches option
> 
> Vladimir Sementsov-Ogievskiy (9):
>    simplebench: bench_one(): add slow_limit argument
>    simplebench: bench_one(): support count=1
>    simplebench/bench-backup: add --compressed option
>    simplebench/bench-backup: add target-cache argument
>    simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED
>    simplebench/bench-backup: support qcow2 source files
>    simplebench/bench-backup: add --count and --no-initial-run
>    simplebench/bench-backup: add --drop-caches argument
>    MAINTAINERS: update Benchmark util: add git tree
> 
>   MAINTAINERS                            |  1 +
>   scripts/simplebench/bench-backup.py    | 95 +++++++++++++++++++++-----
>   scripts/simplebench/bench_block_job.py | 42 +++++++++++-
>   scripts/simplebench/simplebench.py     | 28 +++++++-
>   4 files changed, 144 insertions(+), 22 deletions(-)
> 

Thanks for reviewing, applied to my simplebench branch at
https://src.openvz.org/scm/~vsementsov/qemu.git

I'm going to send pull request now, and see, will Peter take it or not :)

-- 
Best regards,
Vladimir


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2021-05-04  9:03 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-23 13:47 [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 1/9] simplebench: bench_one(): add slow_limit argument Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 2/9] simplebench: bench_one(): support count=1 Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 3/9] simplebench/bench-backup: add --compressed option Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 4/9] simplebench/bench-backup: add target-cache argument Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 5/9] simplebench/bench_block_job: handle error in BLOCK_JOB_COMPLETED Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 6/9] simplebench/bench-backup: support qcow2 source files Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 7/9] simplebench/bench-backup: add --count and --no-initial-run Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 8/9] simplebench/bench-backup: add --drop-caches argument Vladimir Sementsov-Ogievskiy
2021-03-23 13:47 ` [PATCH v3 9/9] MAINTAINERS: update Benchmark util: add git tree Vladimir Sementsov-Ogievskiy
2021-04-27  8:58 ` [PATCH v3 0/9] simplebench improvements Vladimir Sementsov-Ogievskiy
2021-05-04  8:59 ` Vladimir Sementsov-Ogievskiy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).