ovirt-imageio/test/measure_test.py

259 lines
6.2 KiB
Python
Raw Permalink Normal View History

# SPDX-FileCopyrightText: Red Hat, Inc.
# SPDX-License-Identifier: GPL-2.0-or-later
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
from ovirt_imageio._internal.measure import Range, RangeList
# Compare ranges.
def test_range_lt_start_smaller():
assert Range(5, 10) < Range(6, 10)
assert not Range(6, 10) < Range(5, 10)
def test_range_lt_start_same():
assert Range(5, 10) < Range(5, 11)
assert not Range(5, 11) < Range(5, 10)
def test_range_eq():
assert Range(5, 10) == Range(5, 10)
def test_ragne_ne():
assert Range(5, 10) != Range(15, 20)
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
# Add to range list
def test_range_list_empty():
rl = RangeList()
assert rl.sum() == 0
def test_range_list_add_first():
rl = RangeList()
rl.add(Range(0, 10))
assert rl._ranges == [Range(0, 10)]
assert rl.sum() == 10
def test_range_list_add_same():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(0, 10))
assert rl._ranges == [Range(0, 10)]
assert rl.sum() == 10
def test_range_list_add_shorter():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(0, 5))
assert rl._ranges == [Range(0, 10)]
assert rl.sum() == 10
def test_range_list_add_longer():
rl = RangeList()
rl.add(Range(0, 5))
rl.add(Range(0, 10))
assert rl._ranges == [Range(0, 10)]
assert rl.sum() == 10
def test_range_list_add_overlap():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(5, 15))
assert rl._ranges == [Range(0, 15)]
assert rl.sum() == 15
def test_range_list_add_contiguous():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(10, 20))
assert rl._ranges == [Range(0, 20)]
assert rl.sum() == 20
def test_range_list_add_non_contiguous():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
assert rl._ranges == [Range(0, 10), Range(20, 30)]
assert rl.sum() == 20
def test_ragne_list_add_overlap_next_some():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
rl.add(Range(15, 25))
assert rl._ranges == [Range(0, 10), Range(15, 30)]
assert rl.sum() == 25
def test_ragne_list_add_overlap_next_all():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
rl.add(Range(15, 30))
assert rl._ranges == [Range(0, 10), Range(15, 30)]
assert rl.sum() == 25
def test_range_list_add_overlap_both_some():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
rl.add(Range(5, 25))
assert rl._ranges == [Range(0, 30)]
assert rl.sum() == 30
def test_range_list_add_overlap_both_all():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
rl.add(Range(0, 30))
assert rl._ranges == [Range(0, 30)]
assert rl.sum() == 30
def test_range_list_add_overlap_next_multi_some():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
rl.add(Range(40, 50))
rl.add(Range(60, 70))
rl.add(Range(25, 45))
assert rl._ranges == [Range(0, 10), Range(20, 50), Range(60, 70)]
assert rl.sum() == 50
def test_range_list_add_overlap_next_multi_all():
rl = RangeList()
rl.add(Range(0, 10))
rl.add(Range(20, 30))
rl.add(Range(40, 50))
rl.add(Range(60, 70))
rl.add(Range(20, 50))
assert rl._ranges == [Range(0, 10), Range(20, 50), Range(60, 70)]
assert rl.sum() == 50
# Update range list.
def test_range_list_update_first():
rl = RangeList()
rl.update([Range(0, 10), Range(10, 20), Range(20, 30), Range(30, 40)])
assert rl._ranges == [Range(0, 40)]
assert rl.sum() == 40
def test_range_list_update_same():
rl = RangeList()
rl.add(Range(0, 40))
rl.update([Range(0, 10), Range(10, 20), Range(20, 30), Range(30, 40)])
assert rl._ranges == [Range(0, 40)]
assert rl.sum() == 40
def test_range_list_update_contiguous():
rl = RangeList()
rl.update([Range(0, 10), Range(100, 110), Range(200, 210)])
rl.update([Range(10, 20), Range(110, 120), Range(210, 220)])
assert rl._ranges == [Range(0, 20), Range(100, 120), Range(200, 220)]
assert rl.sum() == 60
def test_range_list_update_non_contiguous():
rl = RangeList()
rl.update([Range(0, 10), Range(100, 110), Range(200, 210)])
rl.update([Range(300, 310), Range(400, 410), Range(500, 510)])
assert rl._ranges == [
Range(0, 10),
Range(100, 110),
Range(200, 210),
Range(300, 310),
Range(400, 410),
Range(500, 510),
]
assert rl.sum() == 60
def test_ragne_list_update_overlap_next_some():
rl = RangeList()
rl.update([Range(0, 10), Range(20, 30)])
rl.update([Range(15, 25)])
assert rl._ranges == [Range(0, 10), Range(15, 30)]
assert rl.sum() == 25
def test_ragne_list_update_overlap_next_all():
rl = RangeList()
rl.update([Range(0, 10), Range(20, 30)])
rl.update([Range(15, 30)])
assert rl._ranges == [Range(0, 10), Range(15, 30)]
assert rl.sum() == 25
def test_range_list_update_overlap_both_some():
rl = RangeList()
rl.update([Range(0, 10), Range(20, 30)])
rl.update([Range(5, 25)])
assert rl._ranges == [Range(0, 30)]
assert rl.sum() == 30
def test_range_list_update_overlap_both_all():
rl = RangeList()
rl.update([Range(0, 10), Range(20, 30)])
rl.update([Range(0, 30)])
assert rl._ranges == [Range(0, 30)]
assert rl.sum() == 30
def test_range_list_update_overlap_next_multi_some():
rl = RangeList()
rl.update([Range(0, 10), Range(20, 30), Range(40, 50), Range(60, 70)])
rl.update([Range(5, 35), Range(25, 65)])
assert rl._ranges == [Range(0, 70)]
assert rl.sum() == 70
def test_range_list_update_overlap_next_multi_all():
rl = RangeList()
rl.update([Range(0, 10), Range(20, 30), Range(40, 50), Range(60, 70)])
rl.update([Range(0, 50), Range(20, 70)])
assert rl._ranges == [Range(0, 70)]
assert rl.sum() == 70
# Copy range list.
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
def test_range_list_copy():
r1 = RangeList()
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
r1.add(Range(0, 100))
r1.add(Range(200, 300))
r1.add(Range(400, 500))
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
r2 = RangeList(r1)
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
# r1 and r2 are qqual.
assert r1._ranges == r2._ranges
assert r1.sum() == r2.sum()
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
# But independent.
r1.add(Range(300, 400))
r2.add(Range(100, 200))
measure: Add RangeList Manage completed and ongoing ranges in a new class. This simplifies ticket code, and removes unneeded sorting during merge. The RangeList class support these operations: - add() - add a single range - used when ending an operation. Add the range to the sorted range list, merging consecutive or overlapping ranges. This operation should be fast sine every read, write, or zero request must add a range. - update() - add multiple ranges - used when computing transferred bytes. Copy the current range list, and the unsorted ongoing operations ranges. This happens once every 10 seconds, so it does not have to be fast. - copy() - create a RangeList from another instance. Used to copy completed range list for adding ongoing operations without modifying ticket state. Testing show tiny improvement: test_run_benchmark[nbdcopy-1] 1 workers, 25600 ops, 1.831 s, 13982.81 ops/s test_run_benchmark[nbdcopy-2] 2 workers, 25600 ops, 2.188 s, 11700.50 ops/s test_run_benchmark[nbdcopy-4] 4 workers, 25600 ops, 2.207 s, 11601.56 ops/s test_run_benchmark[nbdcopy-8] 8 workers, 25600 ops, 2.272 s, 11265.57 ops/s test_run_benchmark[imageio-1] 1 workers, 25600 ops, 1.816 s, 14098.55 ops/s test_run_benchmark[imageio-2] 2 workers, 25600 ops, 2.186 s, 11712.27 ops/s test_run_benchmark[imageio-4] 4 workers, 25600 ops, 2.272 s, 11265.23 ops/s test_run_benchmark[imageio-8] 8 workers, 25600 ops, 2.265 s, 11300.43 ops/s test_transferred_benchmark[1] 1 workers, 10000 ops, 0.033 s, 307152.71 ops/s test_transferred_benchmark[2] 2 workers, 10000 ops, 0.043 s, 232254.57 ops/s test_transferred_benchmark[4] 4 workers, 10000 ops, 0.062 s, 162435.13 ops/s test_transferred_benchmark[8] 8 workers, 10000 ops, 0.115 s, 87216.57 ops/s Fixes: #29 Signed-off-by: Nir Soffer <nsoffer@redhat.com>
2022-02-05 08:08:46 +02:00
assert r1._ranges == [Range(0, 100), Range(200, 500)]
assert r2._ranges == [Range(0, 300), Range(400, 500)]