Bug 770683
| Summary: | blockIoTune did not work right with parameters | |||
|---|---|---|---|---|
| Product: | Red Hat Enterprise Linux 6 | Reporter: | Wayne Sun <gsun> | |
| Component: | libvirt | Assignee: | Eric Blake <eblake> | |
| Status: | CLOSED ERRATA | QA Contact: | Virtualization Bugs <virt-bugs> | |
| Severity: | medium | Docs Contact: | ||
| Priority: | high | |||
| Version: | 6.3 | CC: | acathrow, ajia, dallan, dyuan, eblake, jyang, mzhan, rwu, veillard, weizhan | |
| Target Milestone: | rc | |||
| Target Release: | --- | |||
| Hardware: | Unspecified | |||
| OS: | Unspecified | |||
| Whiteboard: | ||||
| Fixed In Version: | libvirt-0.9.10-5.el6 | Doc Type: | Bug Fix | |
| Doc Text: | Story Points: | --- | ||
| Clone Of: | ||||
| : | 819014 (view as bug list) | Environment: | ||
| Last Closed: | 2012-06-20 06:40:26 UTC | Type: | --- | |
| Regression: | --- | Mount Type: | --- | |
| Documentation: | --- | CRM: | ||
| Verified Versions: | Category: | --- | ||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | ||
| Cloudforms Team: | --- | Target Upstream Version: | ||
| Embargoed: | ||||
| Bug Depends On: | ||||
| Bug Blocks: | 796526, 813972, 819014 | |||
|
Description
Wayne Sun
2011-12-28 10:32:28 UTC
Patch on upstream: https://www.redhat.com/archives/libvir-list/2011-December/msg01074.html commit ae3315aa4a296a26845d2920cb581d6be63a4602
Author: Alex Jia <ajia>
Date: Thu Dec 29 13:22:52 2011 +0800
python: Fix problems of virDomain{Set, Get}BlockIoTune bindings
The parameter 'params' is useless for virDomainGetBlockIoTune API,
and the return value type should be a virTypedParameterPtr but not
integer. And "PyArg_ParseTuple" in functions
libvirt_virDomain{Set,Get}BlockIoTune misses format unit for "format"
argument.
* libvirt-override-api.xml: Remove useless the parameter 'params'
from virDomainGetBlockIoTune API, and change return value type from
integer to virTypedParameterPtr.
* python/libvirt-override.c: Add the missed format units.
RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=770683
Signed-off-by: Alex Jia <ajia>
# rpm -q libvirt libvirt-python libvirt-0.9.9-1.el6.x86_64 libvirt-python-0.9.9-1.el6.x86_64 # python Python 2.6.6 (r266:84292, Sep 12 2011, 14:03:14) [GCC 4.4.5 20110214 (Red Hat 4.4.5-6)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import libvirt >>> conn = libvirt.open(None) >>> dom = conn.lookupByName("rhel6u2") >>> dom.blockIoTune('hda', None, 1) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: blockIoTune() takes exactly 3 arguments (4 given) >>> dom.blockIoTune('hda', 0) libvir: QEMU error : internal error cannot read total_bytes_sec >>> dom.blockIoTune('hda', 1) libvir: QEMU error : internal error cannot read total_bytes_sec >>> dom.blockIoTune('hda', 2) {'write_bytes_sec': 0L, 'total_iops_sec': 0L, 'read_iops_sec': 0L, 'read_bytes_sec': 0L, 'write_iops_sec': 0L, 'total_bytes_sec': 0L} Reopening; we want one additional patch (otherwise, setting tuning values on a live domain followed by a libvirtd restart will lose the tuning values on the next guest boot):
commit 172d34298f202d7af3fd7ef3bd0f061020dcb1c8
Author: Eric Blake <eblake>
Date: Fri Feb 10 14:53:49 2012 -0700
qemu: make block io tuning smarter
When blkdeviotune was first committed in 0.9.8, we had the limitation
that setting one value reset all others. But bytes and iops should
be relatively independent. Furthermore, setting tuning values on
a live domain followed by dumpxml did not output the new settings.
* src/qemu/qemu_driver.c (qemuDiskPathToAlias): Add parameter, and
update callers.
(qemuDomainSetBlockIoTune): Don't lose previous unrelated
settings. Make live changes reflect to dumpxml output.
* tools/virsh.pod (blkdeviotune): Update documentation.
Added, back to ON_QA, Daniel packages:
libvirt-0.9.10-5.el6.x86_64
libvirt-python-0.9.10-5.el6.x86_64
qemu-kvm-0.12.1.2-2.247.el6.x86_64
kernel-2.6.32-244.el6.x86_64
steps:
1. prepare a running domain and check iotune status
# virsh list
Id Name State
----------------------------------------------------
2 rhel6u2 running
# virsh blkdeviotune rhel6u2 hda
error: Unable to get block I/O throttle parameters
error: internal error cannot read total_bytes_sec
# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 0
read_bytes_sec : 0
write_bytes_sec: 0
total_iops_sec : 0
read_iops_sec : 0
write_iops_sec : 0
2. set iotune total_bytes_sec live
# virsh blkdeviotune rhel6u2 hda --total_bytes_sec 1000
error: Unable to change block I/O throttle
error: internal error Unexpected error
# virsh dumpxml rhel6u2
...
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source file='/var/lib/libvirt/images/rhel6u2'/>
<target dev='hda' bus='ide'/>
<iotune>
<total_bytes_sec>1000</total_bytes_sec>
</iotune>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
...
Due to lack qemu support, operation fail, but domain xml updated.
3. set iotune read_bytes_sec with --config
# virsh blkdeviotune rhel6u2 hda --read_bytes_sec 1024000 --config
# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 0
read_bytes_sec : 1024000
write_bytes_sec: 0
total_iops_sec : 0
read_iops_sec : 0
write_iops_sec : 0
4. set iotune write_bytes_sec with --config
# virsh blkdeviotune rhel6u2 hda --write_bytes_sec 1000000 --config
[root@intel-e7420-128-1 ~]# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 0
read_bytes_sec : 0
write_bytes_sec: 1000000
total_iops_sec : 0
read_iops_sec : 0
write_iops_sec : 0
write_bytes_sec updated but read_bytes_sec reseted.
continue with other options
# virsh blkdeviotune rhel6u2 hda --read_iops_sec 1000 --config
# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 0
read_bytes_sec : 0
write_bytes_sec: 1000000
total_iops_sec : 0
read_iops_sec : 1000
write_iops_sec : 0
# virsh blkdeviotune rhel6u2 hda --write_iops_sec 1024 --config
[root@intel-e7420-128-1 ~]# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 0
read_bytes_sec : 0
write_bytes_sec: 1000000
total_iops_sec : 0
read_iops_sec : 0
write_iops_sec : 1024
write_iops_sec will reset read_iops_sec, iops setting will not reset bytes setting.
# virsh blkdeviotune rhel6u2 hda --total_bytes_sec 1024000 --config
# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 1024000
read_bytes_sec : 0
write_bytes_sec: 0
total_iops_sec : 0
read_iops_sec : 0
write_iops_sec : 1024
# virsh blkdeviotune rhel6u2 hda --total_iops_sec 1000 --config
# virsh blkdeviotune rhel6u2 hda --config
total_bytes_sec: 1024000
read_bytes_sec : 0
write_bytes_sec: 0
total_iops_sec : 1000
read_iops_sec : 0
write_iops_sec : 0
So, setting between bytes and iops will not interfere each other, but inside bytes or iops will reset others.
Is this expected?
(In reply to comment #9) > > # virsh blkdeviotune rhel6u2 hda > error: Unable to get block I/O throttle parameters > error: internal error cannot read total_bytes_sec No idea when qemu plans on supporting this; so you may be stuck with just testing --config. > 2. set iotune total_bytes_sec live > # virsh blkdeviotune rhel6u2 hda --total_bytes_sec 1000 > error: Unable to change block I/O throttle > error: internal error Unexpected error Matches with the fact that qemu doesn't report it for live domains, therefore you can't set it for live domains. > > # virsh dumpxml rhel6u2 > ... > <disk type='file' device='disk'> > <driver name='qemu' type='raw' cache='none'/> > <source file='/var/lib/libvirt/images/rhel6u2'/> > <target dev='hda' bus='ide'/> > <iotune> > <total_bytes_sec>1000</total_bytes_sec> > </iotune> > <alias name='ide0-0-0'/> > <address type='drive' controller='0' bus='0' target='0' unit='0'/> > </disk> > ... > > Due to lack qemu support, operation fail, but domain xml updated. Hmm, live xml should probably not be updated if the qemu command failed; we may still have a bug. I'll have to look closer. > > 3. set iotune read_bytes_sec with --config > # virsh blkdeviotune rhel6u2 hda --read_bytes_sec 1024000 --config note that per bug 796526, the preferred spelling of this should be --read-bytes-sec, if you are using libvirt-0.9.10-5 or newer; but either spelling works for the QA testing. > > So, setting between bytes and iops will not interfere each other, but inside > bytes or iops will reset others. > > Is this expected? Yes, that's the documented behavior. Valid combinations are: total read write 0 0 0 non-0 0 0 0 non-0 non-0 0 non-0 0 0 0 non-0 and any attempts to set one value (even if you set it explicitly to zero) clears out the other two values. You can set two non-zero values in only the 'read+write' case, and it is your choice whether you set explicit zero (on up to all three arguments) or omit the arguments unrelated to the one you are changing. Attempts to set non-zero values in an unsupported combination (such as 'total+read') should be rejected. This bug is verified according to comment 9, comment 10 and comment 13. The spotted issue now is on track in bug 819014. Thx all for help. Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. http://rhn.redhat.com/errata/RHSA-2012-0748.html |