[libvirt] traffic control

Michal Privoznik mprivozn at redhat.com
Fri May 17 16:46:10 UTC 2013


On 17.05.2013 13:07, Peter V. Saveliev wrote:
>> 
> Hello.
> 
> I would like to start a discussion about network SLA mechs in libvirt.
> 
> Right now, as I understand, libvirt is managing traffic controls, e.g.
> bandwitdh limitation, calling external routines (ip/tc). This approach
> has its own drawbacks, including the need to parse text output of
> external commands and also some complexity with the current state
> identification — the queueing discipline can be changed on the interface
> in runtime outside of libvirt.
> 
> But I would like to propose another approach — not dropping the previous
> one, just as an option, maybe. Not so long time ago I started a project
> [1] that works with netlink directly and can provide standalone daemon,
> that manages interface properties, including queueing disciplines.
> Working with netlink events, it is in permanent sync with the current
> interface statuses w/o any polling. So maybe it would make sense to use
> this daemon — e.g. with JSON or XML-RPC over SSL/TLS, or with any other
> RPC that's preferred by libvirt.
> 
> That approach can provide:
> 
> * more high-level API, that will keep libvirt off the need to compute
> rule and filter handlers, hierarchy and so on — we would be able to
> implement more complex traffic control schemes in more easy way
> 
> * generally speaking, an RPC API is more easy to use, than the execution
> of external binary file and parsing text output, and `tc` is not the
> easiest command to automate.

In fact, there's currently no 'tc' output parsing at all. None is
needed. When setting QoS, libvirt just flushes all previous settings and
insert its own. I don't think libvirt can guarantee things like minimal
throughput if we let other applications to interfere with libvirt QoS
settings. So our reason should be slightly different: offloading QoS
setting to a external application which in turn allows us to create even
more complicated QoS tree. This would be a reasonable trade off.

> 
> If it sounds reasonably enough, we can discuss the overall scheme,
> communication and API details that would be more comfortable to libvirt
> and so on.

Regarding communication with your daemon we have 2 options:

a) A monitor to which libvirt would connect

b) A C library containing APIs that libvirt would call (internally, they
will just hide a) and wrap it into a C function anyway).

Since your application is pure python, going with b) would be like
learning a tux to fly :) Hence I vote for a). Regarding protocol format,
I prefer JSON as libvirt already has capability of parsing it and
creating new messages. The other option is XML.

Currently, the 'tc' is used to manage all three QoS objects: qdisc,
class and filter. Take look at [2] to see the most complicated QoS tree
that libvirt creates. Honestly, I am not sure how to catch that into an
API calls.

Michal

> 
> So, any comments?
> 
> [1] — https://github.com/svinota/pyroute2
2:
http://libvirt.org/git/?p=libvirt.git;a=blob;f=src/util/virnetdevbandwidth.c;h=ccc1449d7695253845e1f138ffebf0500a448eca;hb=HEAD#l96




More information about the libvir-list mailing list