From: Fam Zheng <famz@redhat.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-devel@nongnu.org, Benoit Canet <benoit@irqsave.net>
Subject: Re: [Qemu-devel] [PATCH v4 5/5] qemu-iotests: Add 093 for IO throttling
Date: Wed, 27 Aug 2014 14:19:44 +0800 [thread overview]
Message-ID: <20140827061944.GC2977@T430.nay.redhat.com> (raw)
In-Reply-To: <20140826135041.GF11279@stefanha-thinkpad.redhat.com>
On Tue, 08/26 14:50, Stefan Hajnoczi wrote:
> On Thu, Jun 05, 2014 at 04:47:46PM +0800, Fam Zheng wrote:
> > + def setUp(self):
> > + qemu_img('create', '-f', iotests.imgfmt, test_img, "1G")
> > + #self.vm = iotests.VM().add_drive(test_img, "bps=1024,bps_max=1")
>
> Commented out lines should be dropped
>
> > + self.vm = iotests.VM().add_drive(test_img)
> > + self.vm.launch()
> > +
> > + def tearDown(self):
> > + self.vm.shutdown()
> > + os.remove(test_img)
> > +
> > + def do_test_throttle(self, seconds=10, **limits):
> > + def check_limit(limit, num):
> > + # IO throttling algorithm is discrete, allow 10% error so the test
> > + # is more deterministic
> > + return limit == 0 or num < seconds * limit * 1.1
> > +
> > + nsec_per_sec = 1000000000
> > +
> > + limits['bps_max'] = 1
> > + limits['iops_max'] = 1
> > +
> > + # Enqueue many requests to throttling queue
>
> This comment is wrong, it actually happens further down
>
> > + result = self.vm.qmp("block_set_io_throttle", conv_keys=False, **limits)
> > + self.assert_qmp(result, 'return', {})
> > +
> > + # Set vm clock to a known value
> > + ns = nsec_per_sec
> > + self.vm.qtest_cmd("clock_step %d" % ns)
> > +
> > + # Append many requests into the throttle queue
> > + # They drain bps_max and iops_max
> > + # The rest requests won't get executed until qtest clock is driven
> > + for i in range(1000):
> > + self.vm.hmp_qemu_io("drive0", "aio_read -a -q 0 512")
> > + self.vm.hmp_qemu_io("drive0", "aio_write -a -q 0 512")
> > +
> > + start_rd_bytes, start_rd_iops, start_wr_bytes, start_wr_iops = self.blockstats('drive0')
> > +
> > + ns += seconds * nsec_per_sec
> > + self.vm.qtest_cmd("clock_step %d" % ns)
> > + # wait for a while to let requests take off
> > + time.sleep(1)
>
> This is not a reliable testing approach. If the system is under heavy
> load maybe only a few requests completed. We don't know whether that is
> due to I/O throttling or not.
>
> A reliable test would not perform real disk I/O so the test is
> independent of disk/system speed. And it would not use time.sleep(1) to
> "wait" since there is no guarantee that anything happened in the
> meantime.
>
> Do you think this can be improved?
Throttling only sets the upper limit of IO, this test checks the IO doesn't
cross it: when the test fails, something must be wrong with the throttling;
when the check passes, we can't guarantee that "everything is correct". That's
not uncommon across many other test cases we have. The other half is very hard,
because of host load, etc., which are out of control of this script.
Regarding to disk IO, I've submitted a separate patch, the "null://" protocol,
which can be used to sidestep the host disk load uncertainty. I can base this
test on top.
>
> > + end_rd_bytes, end_rd_iops, end_wr_bytes, end_wr_iops = self.blockstats('drive0')
> > +
> > + rd_bytes = end_rd_bytes - start_rd_bytes
> > + rd_iops = end_rd_iops - start_rd_iops
> > + wr_bytes = end_wr_bytes - start_wr_bytes
> > + wr_iops = end_wr_iops - start_wr_iops
> > +
> > + assert check_limit(limits['bps'], rd_bytes)
> > + assert check_limit(limits['bps_rd'], rd_bytes)
> > + assert check_limit(limits['bps'], wr_bytes)
> > + assert check_limit(limits['bps_wr'], wr_bytes)
> > + assert check_limit(limits['iops'], rd_iops)
> > + assert check_limit(limits['iops_rd'], rd_iops)
> > + assert check_limit(limits['iops'], wr_iops)
> > + assert check_limit(limits['iops_wr'], wr_iops)
>
> Please use TestCase.assert*() methods instead of plain assert. They
> produce humand-readable error messages including the failing values.
OK.
>
> > +
> > + def test_bps(self):
> > + self.do_test_throttle(**{
> > + 'device': 'drive0',
> > + 'bps': 1000,
> > + 'bps_rd': 0,
> > + 'bps_wr': 0,
> > + 'iops': 0,
> > + 'iops_rd': 0,
> > + 'iops_wr': 0,
> > + })
>
> Keyword argument syntax is more concise:
>
> self.do_test_throttle(device='drive0',
> bps=1000,
> bps_rd=0,
> ...)
OK, will change.
Thanks,
Fam
next prev parent reply other threads:[~2014-08-27 6:19 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-05 8:47 [Qemu-devel] [PATCH v4 0/5] This series adds iotest case for IO throttling Fam Zheng
2014-06-05 8:47 ` [Qemu-devel] [PATCH v4 1/5] qemu-io: Account IO by aio_read and aio_write Fam Zheng
2014-06-05 8:47 ` [Qemu-devel] [PATCH v4 2/5] qtest: Add scripts/qtest/qtest.py Fam Zheng
2014-08-26 13:21 ` Stefan Hajnoczi
2014-08-27 3:12 ` Fam Zheng
2014-06-05 8:47 ` [Qemu-devel] [PATCH v4 3/5] qemu-iotests: Add VM method qtest() to iotests.py Fam Zheng
2014-06-05 8:47 ` [Qemu-devel] [PATCH v4 4/5] qemu-iotests: Allow caller to disable underscore convertion for qmp Fam Zheng
2014-06-05 8:47 ` [Qemu-devel] [PATCH v4 5/5] qemu-iotests: Add 093 for IO throttling Fam Zheng
2014-08-26 13:50 ` Stefan Hajnoczi
2014-08-27 6:19 ` Fam Zheng [this message]
2014-08-27 8:46 ` Stefan Hajnoczi
2014-06-17 2:45 ` [Qemu-devel] [PATCH v4 0/5] This series adds iotest case " Fam Zheng
2014-07-31 7:29 ` Fam Zheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20140827061944.GC2977@T430.nay.redhat.com \
--to=famz@redhat.com \
--cc=benoit@irqsave.net \
--cc=kwolf@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).