[libvirt] [RFC PATCH 0/8 v3] Summary on block IO throttle
Lei Li
lilei at linux.vnet.ibm.com
Thu Nov 10 05:46:25 UTC 2011
On 11/10/2011 12:45 PM, Zhi Yong Wu wrote:
> On Thu, Nov 10, 2011 at 4:32 AM, Lei Li<lilei at linux.vnet.ibm.com> wrote:
>> Changes since V2
>> - Implement the Python binding support for setting blkio throttling.
>> - Implement --current --live --config options support to unify the libvirt API.
>> - Add changes in docs and tests.
>> - Some changes suggested by Adam Litke, Eric Blake, Daniel P. Berrange.
>> - Change the XML schema.
>> - API name to virDomain{Set, Get}BlockIoTune.
>> - Parameters changed to make them more self-explanatory.
>> - virsh command name to blkdeviotune.
>> - And other fixups.
>>
>> Changes since V1
>> - Implement the support to get the block io throttling for
>> a device as read only connection - QMP/HMP.
>> - Split virDomainBlockIoThrottle into two separate functions
>> virDomainSetBlockIoThrottle - Set block I/O limits for a device
>> - Requires a connection in 'write' mode.
>> - Limits (info) structure passed as an input parameter
>> virDomainGetBlockIoThrottle - Get the current block I/O limits for a device
>> - Works on a read-only connection.
>> - Current limits are written to the output parameter (reply).
>> - And Other fixups suggested by Adam Litke, Daniel P. Berrange.
>> - For dynamically allocate the blkiothrottle struct, I will fix
>> it when implement --current --live --config options support.
>>
>> Today libvirt supports the cgroups blkio-controller, which handles
>> proportional shares and throughput/iops limits on host block devices.
>> blkio-controller does not support network file systems (NFS) or other
>> QEMU remote block drivers (curl, Ceph/rbd, sheepdog) since they are
>> not host block devices. QEMU I/O throttling works with all types of
>> drive and can be applied independently to each drive attached to
>> a guest and supports throughput/iops limits.
>>
>> To help add QEMU I/O throttling support to libvirt, we plan to complete
>> it with add new API virDomain{Set, Get}BlockIoThrottle(), new command 'blkdeviotune'
>> and Python bindings.
>>
>> Notes: Now all the planed features were implemented (#1#2 were implemented by
>> Zhi Yong Wu), the previous comments were all fixed up too. And the qemu part patches
>> have been accepted upstream just now and are expected to be part of the QEMU 1.1
>> release, git tree from Zhi Yong:
>>
>> http://repo.or.cz/w/qemu/kevin.git/shortlog/refs/heads/block
>>
>>
>> 1) Enable the blkio throttling in xml when guest is starting up.
>>
>> Add blkio throttling in xml as follows:
>>
>> <disk type='file' device='disk'>
>> ...
>> <iotune>
>> <total_bytes_sec>nnn</total_bytes_sec>
>> ...
>> </iotune>
>> ...
>> </disk>
>>
>> 2) Enable blkio throttling setting at guest running time.
>>
>> virsh blkdeviotune<domain> <device> [--total_bytes_sec<number>] [--read_bytes_sec<number>] \
>> [--write_bytes_sec<number>] [--total_iops_sec<number>] [--read_iops_sec<number>]
>> [--write_iops_sec<number>]
>>
>> 3) The support to get the current block i/o throttling for a device - HMP/QMP.
>>
>> virsh blkiothrottle<domain> <device>
>> total_bytes_sec:
>> read_bytes_sec:
>> write_bytes_sec:
>> total_iops_sec:
>> read_iops_sec:
>> write_iops_sec:
>>
>> 4) Python binding support for setting blkio throttling.
>> 5) --current --live --config options support to unify the libvirt API.
>>
>> virsh blkdeviotune<domain> <device> [--total_bytes_sec<number>] [--read_bytes_sec<number>]
>> [--write_bytes_sec<number>] [--total_iops_sec<number>] [--read_iops_sec<number>]
>> [--write_iops_sec<number>] [--config] [--live] [--current]
> Thanks Li Lei for the remaining works. Below is only one reminder.
> QEMU command line options have some limitations as below:
>
> (1) global bps limit.
> -drive bps=xxx in bytes/s
> (2) only read bps limit
> -drive bps_rd=xxx in bytes/s
> (3) only write bps limit
> -drive bps_wr=xxx in bytes/s
> (4) global iops limit
> -drive iops=xxx in ios/s
> (5) only read iops limit
> -drive iops_rd=xxx in ios/s
> (6) only write iops limit
> -drive iops_wr=xxx in ios/s
> (7) the combination of some limits.
> -drive bps=xxx,iops=xxx
>
> Known Limitations:
> (1) #1 can not be used with #2, #3 together
> (2) #4 can not be used with #5, #6 together
>
Yes, you might want to look into the code about domain_conf.c
and qemu_driver.c part, I have already do the limitations on
both XML and the command.
>>
>>
>> daemon/remote.c | 87 +++++++
>> docs/formatdomain.html.in | 30 ++
>> docs/schemas/domaincommon.rng | 24 +
>> include/libvirt/libvirt.h.in | 25 ++
>> python/generator.py | 2
>> python/libvirt-override-api.xml | 16 +
>> python/libvirt-override.c | 85 +++++++
>> src/conf/domain_conf.c | 101 ++++++++
>> src/conf/domain_conf.h | 12
>> src/driver.h | 18 +
>> src/libvirt.c | 115 +++++++++
>> src/libvirt_public.syms | 2
>> src/qemu/qemu_command.c | 33 ++
>> src/qemu/qemu_driver.c | 217 ++++++++++++++++++
>> src/qemu/qemu_monitor.c | 36 ++
>> src/qemu/qemu_monitor.h | 10
>> src/qemu/qemu_monitor_json.c | 191 +++++++++++++++
>> src/qemu/qemu_monitor_json.h | 10
>> src/qemu/qemu_monitor_text.c | 152 ++++++++++++
>> src/qemu/qemu_monitor_text.h | 10
>> src/remote/remote_driver.c | 81 ++++++
>> src/remote/remote_protocol.x | 39 +++
>> src/remote_protocol-structs | 34 ++
>> src/util/xml.h | 3
>> tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.args | 4
>> tests/qemuxml2argvdata/qemuxml2argv-blkdeviotune.xml | 36 ++
>> tests/qemuxml2argvtest.c | 2
>> tests/qemuxml2xmltest.c | 2
>> tools/virsh.c | 146 ++++++++++++
>> tools/virsh.pod | 23 +
>> 30 files changed, 1540 insertions(+), 6 deletions(-)
>>
>> --
>> Lei
>>
>> --
>> libvir-list mailing list
>> libvir-list at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
>>
>
>
--
Lei
More information about the libvir-list
mailing list