Re: [PATCH v2] scripts/simplebench: compare write request performance

2020-07-13 Thread Vladimir Sementsov-Ogievskiy

13.07.2020 13:26, Andrey Shinkevich wrote:

On 13.07.2020 11:43, Vladimir Sementsov-Ogievskiy wrote:

12.07.2020 19:07, Andrey Shinkevich wrote:

On 11.07.2020 16:05, Vladimir Sementsov-Ogievskiy wrote:

26.06.2020 17:31, Andrey Shinkevich wrote:

The script 'bench_write_req.py' allows comparing performances of write
request for two qemu-img binary files.
An example with (qemu-img binary 1) and without (qemu-img binary 2) the
applied patch "qcow2: skip writing zero buffers to empty COW areas"
(git commit ID: c8bb23cbdbe32f5)
The  case does not involve the COW optimization.


Good, this proves that c8bb23cbdbe32f5 makes sense.


Suggested-by: Denis V. Lunev 
Suggested-by: Vladimir Sementsov-Ogievskiy 
Signed-off-by: Andrey Shinkevich 
---
v2:
   01: Three more test cases added to the script:
   
   
   

  scripts/simplebench/bench_write_req.py | 201 +
  1 file changed, 201 insertions(+)
  create mode 100755 scripts/simplebench/bench_write_req.py

diff --git a/scripts/simplebench/bench_write_req.py 
b/scripts/simplebench/bench_write_req.py
new file mode 100755
index 000..fe92d01
--- /dev/null
+++ b/scripts/simplebench/bench_write_req.py
@@ -0,0 +1,201 @@


Next, I don't understand, are you trying to fill qcow2 image by dd directly? 
This is strange. Even if you don't break metadata, you don't change it, so all 
cluster will remain empty.



I have tested and it works as designed.



But how is it designed? You just filled unallocated clusters with some data. 
When you read from qcow2, you'll still read zeros, because L1/L2 tables are not 
filled. The random data will lay untouched.




Sounds reasonable. But why do QEMU-ING INFO shows the actual size increased 
after the dd command?



Because actual file size changed :) img-info shows two sizes: virtual disk size 
(it's unchanged of course), and real size of file, which is affected by dd of 
course.



--
Best regards,
Vladimir



Re: [PATCH v2] scripts/simplebench: compare write request performance

2020-07-13 Thread Andrey Shinkevich

On 13.07.2020 11:43, Vladimir Sementsov-Ogievskiy wrote:

12.07.2020 19:07, Andrey Shinkevich wrote:

On 11.07.2020 16:05, Vladimir Sementsov-Ogievskiy wrote:

26.06.2020 17:31, Andrey Shinkevich wrote:

The script 'bench_write_req.py' allows comparing performances of write
request for two qemu-img binary files.
An example with (qemu-img binary 1) and without (qemu-img binary 2) 
the

applied patch "qcow2: skip writing zero buffers to empty COW areas"
(git commit ID: c8bb23cbdbe32f5)
The  case does not involve the COW optimization.


Good, this proves that c8bb23cbdbe32f5 makes sense.


Suggested-by: Denis V. Lunev 
Suggested-by: Vladimir Sementsov-Ogievskiy 
Signed-off-by: Andrey Shinkevich 
---
v2:
   01: Three more test cases added to the script:
   
   
   

  scripts/simplebench/bench_write_req.py | 201 
+

  1 file changed, 201 insertions(+)
  create mode 100755 scripts/simplebench/bench_write_req.py

diff --git a/scripts/simplebench/bench_write_req.py 
b/scripts/simplebench/bench_write_req.py

new file mode 100755
index 000..fe92d01
--- /dev/null
+++ b/scripts/simplebench/bench_write_req.py
@@ -0,0 +1,201 @@


Next, I don't understand, are you trying to fill qcow2 image by dd 
directly? This is strange. Even if you don't break metadata, you 
don't change it, so all cluster will remain empty.




I have tested and it works as designed.



But how is it designed? You just filled unallocated clusters with some 
data. When you read from qcow2, you'll still read zeros, because L1/L2 
tables are not filled. The random data will lay untouched.



This dd command doesn't hurt the metadata and fills the image with 
random data. The actual disk size becomes about 1G after the dd command.


If patch 0001 is OK in v4, I can remove the patches 0002 and 0003 with 
the 'unaligned' test case as an unnecessary one.


Andrey




Re: [PATCH v2] scripts/simplebench: compare write request performance

2020-07-13 Thread Andrey Shinkevich

On 13.07.2020 11:43, Vladimir Sementsov-Ogievskiy wrote:

12.07.2020 19:07, Andrey Shinkevich wrote:

On 11.07.2020 16:05, Vladimir Sementsov-Ogievskiy wrote:

26.06.2020 17:31, Andrey Shinkevich wrote:

The script 'bench_write_req.py' allows comparing performances of write
request for two qemu-img binary files.
An example with (qemu-img binary 1) and without (qemu-img binary 2) 
the

applied patch "qcow2: skip writing zero buffers to empty COW areas"
(git commit ID: c8bb23cbdbe32f5)
The  case does not involve the COW optimization.


Good, this proves that c8bb23cbdbe32f5 makes sense.


Suggested-by: Denis V. Lunev 
Suggested-by: Vladimir Sementsov-Ogievskiy 
Signed-off-by: Andrey Shinkevich 
---
v2:
   01: Three more test cases added to the script:
   
   
   

  scripts/simplebench/bench_write_req.py | 201 
+

  1 file changed, 201 insertions(+)
  create mode 100755 scripts/simplebench/bench_write_req.py

diff --git a/scripts/simplebench/bench_write_req.py 
b/scripts/simplebench/bench_write_req.py

new file mode 100755
index 000..fe92d01
--- /dev/null
+++ b/scripts/simplebench/bench_write_req.py
@@ -0,0 +1,201 @@


Next, I don't understand, are you trying to fill qcow2 image by dd 
directly? This is strange. Even if you don't break metadata, you 
don't change it, so all cluster will remain empty.




I have tested and it works as designed.



But how is it designed? You just filled unallocated clusters with some 
data. When you read from qcow2, you'll still read zeros, because L1/L2 
tables are not filled. The random data will lay untouched.





Sounds reasonable. But why do QEMU-ING INFO shows the actual size 
increased after the dd command?


Andrey


This dd command doesn't hurt the metadata and fills the image with 
random data. The actual disk size becomes about 1G after the dd command.









Re: [PATCH v2] scripts/simplebench: compare write request performance

2020-07-13 Thread Vladimir Sementsov-Ogievskiy

12.07.2020 19:07, Andrey Shinkevich wrote:

On 11.07.2020 16:05, Vladimir Sementsov-Ogievskiy wrote:

26.06.2020 17:31, Andrey Shinkevich wrote:

The script 'bench_write_req.py' allows comparing performances of write
request for two qemu-img binary files.
An example with (qemu-img binary 1) and without (qemu-img binary 2) the
applied patch "qcow2: skip writing zero buffers to empty COW areas"
(git commit ID: c8bb23cbdbe32f5)
The  case does not involve the COW optimization.


Good, this proves that c8bb23cbdbe32f5 makes sense.


Suggested-by: Denis V. Lunev 
Suggested-by: Vladimir Sementsov-Ogievskiy 
Signed-off-by: Andrey Shinkevich 
---
v2:
   01: Three more test cases added to the script:
   
   
   

  scripts/simplebench/bench_write_req.py | 201 +
  1 file changed, 201 insertions(+)
  create mode 100755 scripts/simplebench/bench_write_req.py

diff --git a/scripts/simplebench/bench_write_req.py 
b/scripts/simplebench/bench_write_req.py
new file mode 100755
index 000..fe92d01
--- /dev/null
+++ b/scripts/simplebench/bench_write_req.py
@@ -0,0 +1,201 @@


Next, I don't understand, are you trying to fill qcow2 image by dd directly? 
This is strange. Even if you don't break metadata, you don't change it, so all 
cluster will remain empty.



I have tested and it works as designed.



But how is it designed? You just filled unallocated clusters with some data. 
When you read from qcow2, you'll still read zeros, because L1/L2 tables are not 
filled. The random data will lay untouched.

 

This dd command doesn't hurt the metadata and fills the image with random data. 
The actual disk size becomes about 1G after the dd command.




--
Best regards,
Vladimir



Re: [PATCH v2] scripts/simplebench: compare write request performance

2020-07-12 Thread Andrey Shinkevich

On 11.07.2020 16:05, Vladimir Sementsov-Ogievskiy wrote:

26.06.2020 17:31, Andrey Shinkevich wrote:

The script 'bench_write_req.py' allows comparing performances of write
request for two qemu-img binary files.
An example with (qemu-img binary 1) and without (qemu-img binary 2) the
applied patch "qcow2: skip writing zero buffers to empty COW areas"
(git commit ID: c8bb23cbdbe32f5)
The  case does not involve the COW optimization.


Good, this proves that c8bb23cbdbe32f5 makes sense.


Suggested-by: Denis V. Lunev 
Suggested-by: Vladimir Sementsov-Ogievskiy 
Signed-off-by: Andrey Shinkevich 
---
v2:
   01: Three more test cases added to the script:
   
   
   

  scripts/simplebench/bench_write_req.py | 201 
+

  1 file changed, 201 insertions(+)
  create mode 100755 scripts/simplebench/bench_write_req.py

diff --git a/scripts/simplebench/bench_write_req.py 
b/scripts/simplebench/bench_write_req.py

new file mode 100755
index 000..fe92d01
--- /dev/null
+++ b/scripts/simplebench/bench_write_req.py
@@ -0,0 +1,201 @@


Next, I don't understand, are you trying to fill qcow2 image by dd 
directly? This is strange. Even if you don't break metadata, you don't 
change it, so all cluster will remain empty.




I have tested and it works as designed.

This dd command doesn't hurt the metadata and fills the image with 
random data. The actual disk size becomes about 1G after the dd command.


Andrey




Re: [PATCH v2] scripts/simplebench: compare write request performance

2020-07-11 Thread Vladimir Sementsov-Ogievskiy

26.06.2020 17:31, Andrey Shinkevich wrote:

The script 'bench_write_req.py' allows comparing performances of write
request for two qemu-img binary files.
An example with (qemu-img binary 1) and without (qemu-img binary 2) the
applied patch "qcow2: skip writing zero buffers to empty COW areas"
(git commit ID: c8bb23cbdbe32f5)
The  case does not involve the COW optimization.

SSD:
-  ---  ---
  
  2.72 +- 0.00 11.67 +- 1.04
 0.34 +- 0.00 8.64 +- 1.55
   0.33 +- 0.01 8.13 +- 2.05
  8.46 +- 0.06 12.97 +- 1.07
9.27 +- 2.04 8.83 +- 0.84
-  ---  ---
HDD:
-  ---  ---
  
  617.86 +- 6.78   608.84 +- 10.72
 57.53 +- 3.5652.99 +- 7.48
   60.50 +- 1.9256.11 +- 5.20
  12.10 +- 1.1015.16 +- 2.56
6.23 +- 0.05 6.40 +- 0.07
-  ---  ---



Good, this proves that c8bb23cbdbe32f5 makes sense.


Suggested-by: Denis V. Lunev 
Suggested-by: Vladimir Sementsov-Ogievskiy 
Signed-off-by: Andrey Shinkevich 
---
v2:
   01: Three more test cases added to the script:
   
   
   

  scripts/simplebench/bench_write_req.py | 201 +
  1 file changed, 201 insertions(+)
  create mode 100755 scripts/simplebench/bench_write_req.py

diff --git a/scripts/simplebench/bench_write_req.py 
b/scripts/simplebench/bench_write_req.py
new file mode 100755
index 000..fe92d01
--- /dev/null
+++ b/scripts/simplebench/bench_write_req.py
@@ -0,0 +1,201 @@
+#!/usr/bin/env python3
+#
+# Test to compare performance of write requests for two qemu-img binary files.
+#
+# Copyright (c) 2020 Virtuozzo International GmbH.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see .
+#
+
+
+import sys
+import os
+import subprocess
+import simplebench
+
+
+def bench_func(env, case):
+""" Handle one "cell" of benchmarking table. """
+return bench_write_req(env['qemu_img'], env['image_name'],
+   case['block_size'], case['block_offset'],
+   case['requests'], case['empty_image'])
+
+
+def qemu_img_pipe(*args):
+'''Run qemu-img and return its output'''
+subp = subprocess.Popen(list(args),
+stdout=subprocess.PIPE,
+stderr=subprocess.STDOUT,
+universal_newlines=True)
+exitcode = subp.wait()
+if exitcode < 0:
+sys.stderr.write('qemu-img received signal %i: %s\n'
+ % (-exitcode, ' '.join(list(args
+return subp.communicate()[0]


I understand that it's duplicated from iotests.py.. Hmm, we probably should 
move most of its functionality into python/ and reuse here, but I don't ask you 
do it, this patch my keep the copy I think.


+
+
+def bench_write_req(qemu_img, image_name, block_size, block_offset, requests,
+empty_image):
+"""Benchmark write requests
+
+qemu_img -- path to qemu_img executable file
+image_name   -- QCOW2 image name to create
+block_size   -- size of a block to write to clusters
+block_offset -- offset of the block in clusters
+requests -- number of write requests per cluster, customize if zero
+empty_image  -- if True, fill image with random data
+


Some comment on the behavior of the function won't hurt.


+Returns {'seconds': int} on success and {'error': str} on failure.
+Return value is compatible with simplebench lib.
+"""
+
+if not os.path.isfile(qemu_img):
+print('File not found: {}'.format(qemu_img))
+sys.exit(1)
+
+image_dir = os.path.dirname(os.path.abspath(image_name))
+if not os.path.isdir(image_dir):
+print('Path not found: {}'.format(image_name))
+sys.exit(1)
+
+cluster_size = 1024 * 1024
+image_size = 1024 * cluster_size
+seek = 4
+dd_count = int(image_size / cluster_size) - seek
+
+args_create = [qemu_img, 'create', '-f', 'qcow2', '-o',
+   'cluster_size={}'.format(cluster_size),
+   image_name, str(image_size)]
+
+if requests:
+count = requests * int(image_size / cluster_size)
+step = str(cluster_size)
+