Message ID | 20241217131440.1980151-2-nilay@linux.ibm.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | throtl: fix IO block-size and race while submitting IO | expand |
在 2024/12/17 21:14, Nilay Shroff 写道: > The commit 60fa2e3ff3ab ("update max_sectors setting") added max-sectors > while setting up throttle device. So now we should also calculate block- > size which matches the wiops. Typically, size of each IO which is submitted > to the block device depends on the max-sectors setting of the block device. > For example setting max-sectors to 128 results into 64kb of max. IO size > which should be used for sending read/write command to the device. So take > into account the max-sectors-kb and wiops settings and calculate the > appropriate block-size which is then used to issue IO to the block device. > This change would result in always submitting 256 I/O read/write commands > to block device. > > Without this change on a system with 64k PAGE SIZE, using block-size of 1M > would result in 16 I/O being submitted to the device and this operation may > finish in a fraction of a section and result in test failure. However the > intent of this test case is that we want to test submitting 256 I/O after > setting wiops limit to 256. > > Signed-off-by: Nilay Shroff <nilay@linux.ibm.com> > --- > tests/throtl/002 | 14 ++++++++++---- > tests/throtl/rc | 4 ++++ > 2 files changed, 14 insertions(+), 4 deletions(-) > LGTM Reviewed-by: Yu Kuai <yukuai3@huawei.com> > diff --git a/tests/throtl/002 b/tests/throtl/002 > index 185e66b..02b0969 100755 > --- a/tests/throtl/002 > +++ b/tests/throtl/002 > @@ -14,6 +14,9 @@ test() { > echo "Running ${TEST_NAME}" > > local page_size max_secs > + local io_size_kb block_size > + local iops=256 > + > page_size=$(getconf PAGE_SIZE) > max_secs=$((page_size / 512)) > > @@ -21,12 +24,15 @@ test() { > return 1; > fi > > - _throtl_set_limits wiops=256 > - _throtl_test_io write 1M 1 > + io_size_kb=$(($(_throtl_get_max_io_size) * 1024)) > + block_size=$((iops * io_size_kb)) > + > + _throtl_set_limits wiops="${iops}" > + _throtl_test_io write "${block_size}" 1 > _throtl_remove_limits > > - _throtl_set_limits riops=256 > - _throtl_test_io read 1M 1 > + _throtl_set_limits riops="${iops}" > + _throtl_test_io read "${block_size}" 1 > _throtl_remove_limits > > _clean_up_throtl > diff --git a/tests/throtl/rc b/tests/throtl/rc > index 9c264bd..330e6b9 100644 > --- a/tests/throtl/rc > +++ b/tests/throtl/rc > @@ -71,6 +71,10 @@ _throtl_remove_limits() { > "$CGROUP2_DIR/$THROTL_DIR/io.max" > } > > +_throtl_get_max_io_size() { > + cat "/sys/block/$THROTL_DEV/queue/max_sectors_kb" > +} > + > _throtl_issue_io() { > local start_time > local end_time >
diff --git a/tests/throtl/002 b/tests/throtl/002 index 185e66b..02b0969 100755 --- a/tests/throtl/002 +++ b/tests/throtl/002 @@ -14,6 +14,9 @@ test() { echo "Running ${TEST_NAME}" local page_size max_secs + local io_size_kb block_size + local iops=256 + page_size=$(getconf PAGE_SIZE) max_secs=$((page_size / 512)) @@ -21,12 +24,15 @@ test() { return 1; fi - _throtl_set_limits wiops=256 - _throtl_test_io write 1M 1 + io_size_kb=$(($(_throtl_get_max_io_size) * 1024)) + block_size=$((iops * io_size_kb)) + + _throtl_set_limits wiops="${iops}" + _throtl_test_io write "${block_size}" 1 _throtl_remove_limits - _throtl_set_limits riops=256 - _throtl_test_io read 1M 1 + _throtl_set_limits riops="${iops}" + _throtl_test_io read "${block_size}" 1 _throtl_remove_limits _clean_up_throtl diff --git a/tests/throtl/rc b/tests/throtl/rc index 9c264bd..330e6b9 100644 --- a/tests/throtl/rc +++ b/tests/throtl/rc @@ -71,6 +71,10 @@ _throtl_remove_limits() { "$CGROUP2_DIR/$THROTL_DIR/io.max" } +_throtl_get_max_io_size() { + cat "/sys/block/$THROTL_DEV/queue/max_sectors_kb" +} + _throtl_issue_io() { local start_time local end_time
The commit 60fa2e3ff3ab ("update max_sectors setting") added max-sectors while setting up throttle device. So now we should also calculate block- size which matches the wiops. Typically, size of each IO which is submitted to the block device depends on the max-sectors setting of the block device. For example setting max-sectors to 128 results into 64kb of max. IO size which should be used for sending read/write command to the device. So take into account the max-sectors-kb and wiops settings and calculate the appropriate block-size which is then used to issue IO to the block device. This change would result in always submitting 256 I/O read/write commands to block device. Without this change on a system with 64k PAGE SIZE, using block-size of 1M would result in 16 I/O being submitted to the device and this operation may finish in a fraction of a section and result in test failure. However the intent of this test case is that we want to test submitting 256 I/O after setting wiops limit to 256. Signed-off-by: Nilay Shroff <nilay@linux.ibm.com> --- tests/throtl/002 | 14 ++++++++++---- tests/throtl/rc | 4 ++++ 2 files changed, 14 insertions(+), 4 deletions(-)