[libvirt] [PATCH v4 0/6] introduce support for an embedded driver mode

Daniel P. Berrangé posted 6 patches 2 weeks ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20200110103430.3564679-1-berrange@redhat.com
build-aux/syntax-check.mk               |   2 +-
docs/Makefile.am                        |   5 +
docs/drivers.html.in                    |   1 +
docs/drvqemu.html.in                    |  99 ++++++++
docs/drvsecret.html.in                  |  82 ++++++
docs/manpages/index.rst                 |   1 +
docs/manpages/virt-qemu-run.rst         | 114 +++++++++
libvirt.spec.in                         |   2 +
src/Makefile.am                         |   1 +
src/driver-state.h                      |   2 +
src/driver.h                            |   2 +
src/interface/interface_backend_netcf.c |   7 +
src/interface/interface_backend_udev.c  |   7 +
src/libvirt.c                           |  93 ++++++-
src/libvirt_internal.h                  |   4 +-
src/libvirt_private.syms                |   1 +
src/libxl/libxl_driver.c                |   7 +
src/lxc/lxc_driver.c                    |   8 +
src/network/bridge_driver.c             |   7 +
src/node_device/node_device_hal.c       |   7 +
src/node_device/node_device_udev.c      |   7 +
src/nwfilter/nwfilter_driver.c          |   7 +
src/qemu/Makefile.inc.am                |  13 +
src/qemu/qemu_conf.c                    |  45 +++-
src/qemu/qemu_conf.h                    |   8 +-
src/qemu/qemu_driver.c                  |  34 ++-
src/qemu/qemu_process.c                 |  15 +-
src/qemu/qemu_shim.c                    | 322 ++++++++++++++++++++++++
src/remote/remote_daemon.c              |   1 +
src/remote/remote_driver.c              |   1 +
src/secret/secret_driver.c              |  53 +++-
src/storage/storage_driver.c            |   7 +
src/util/viruri.c                       |  16 ++
src/util/viruri.h                       |   2 +
src/vz/vz_driver.c                      |   7 +
tests/domaincapstest.c                  |   2 +-
tests/testutilsqemu.c                   |   3 +-
37 files changed, 967 insertions(+), 28 deletions(-)
create mode 100644 docs/drvsecret.html.in
create mode 100644 docs/manpages/virt-qemu-run.rst
create mode 100644 src/qemu/qemu_shim.c

[libvirt] [PATCH v4 0/6] introduce support for an embedded driver mode

Posted by Daniel P. Berrangé 2 weeks ago
This is a followup to:

 v1: https://www.redhat.com/archives/libvir-list/2019-May/msg00467.html
 v2: https://www.redhat.com/archives/libvir-list/2019-December/msg00050.html
 v3: https://www.redhat.com/archives/libvir-list/2019-December/msg01364.html

This series implements support for an embedded driver mode for libvirt,
with initial support in the QEMU and secrets drivers.

In this mode of operation, the driver stores all its config and state
under a private directory tree.  See the individual patches for the
illustrated directory hierarchy used.

The intent of this embedded mode is to suit cases where the application
is using virtualization as a building block for some functionality, as
opposed to running traditional "full OS" builds.

The long time posterchild example would be libguestfs, while a more
recent example could be Kata containers.

The general principal in enabling this embedded mode is that the
functionality available should be identical to that seen when the
driver is running inside libvirtd. This is achieved by loading the
exact same driver .so module as libvirtd would load, and simply
configuring it with a different directory layout.

The result of this is that when running in embedded mode, the driver
can still talk to other secondary drivers running inside libvirtd
if desired. This is useful, for example, to connect a VM to the
default virtual network.

The secondary drivers can be made to operate in embedded mode as
well, however, this will require some careful consideration for each
driver to ensure they don't clash with each other. Thus in this series
only the secret driver is enabled for embedded mode. This is required
to enable use of VMs with encrypted disks, or authenticated network
block storage.

In this series we introduce a new command line tool 'virt-qemu-run'
which is a really simple tool for launching a VM in embedded mode.

I'm not entirely sure whether we should provide this as an official
supported tool in this way, or merely put it into the 'examples'
directory as demo-ware.

With testing of the virt-qemu-run tool we can immediately see what the
next important thing to tackle is: performance. We have not really cared
too much about the startup performance of libvirtd as this is a one time
cost when the mgmt application connects. We did none the less cache
capabilities because probing caps for 30 QEMU binaries takes a long time.

Even with this caching it takes an unacceptably long time to start a VM
in embedded mode. About 100 ms to open the embedded QEMU driver,
assuming pre-cached capabilies - ~2 seconds if not cached and all 30
QEMU targets are present. Then about 300 ms to actually start the QEMU
guest.

IOW, about 400 ms to get QEMU running. NB this is measuring time from
launching the virt-run-qemu program, to the point at which the API call
'virDomainCreate' returns control. This has both libvirt & QEMU overhead
in & I don't have clear figures to distinguish, but I can see a 40 ms
delay between issuing the 'qmp_capabilities' call and getting a reply,
which is QEMU startup overead.

This is a i440fx based QEMU with a general purpose virtio-pci config
(disk, net, etc) tyupical for running a full OS. I've not tried any
kind of optimized QEMU config with microvm.

I've already started on measuring & optimizing & identified several key
areas that can be addressed, but it is all ultimately about not doing
work before we need the answers from that work (which often means we
will never do the work at all).

For example, we shouldn't probe all 30 QEMU's upfront. If the app is
only going to create an x86_64 KVM guest we should only care about that
1 QEMU. This is painful because parsing any guest XML requires a
virCapsPtr which in turn causes probing of every QEMU binary. I've got
in progress patches to eliminate virCapsPtr almost entirely and work
directly with the virQEMUCapsPtr instead.

It is possible we'll want to use a different file format for storing
the cached QEMU capabilities, and the CPU feature/model info. Parsing
this XML is a non-negligible time sink. A binary format is likely way
quicker, especially if its designed to be just mmap'able for direct
read. To be investigated...

We shouldn't probe for whether host PM suspend is possible unless
someone wants that info, or tries to issue that API call.

After starting QEMU we spend 150-200 ms issuing a massive number of
qom-get calls to check whether QEMU enabled each individual CPU feature
flag. We only need this info if someone asks for the live XML or we
intend to live migrate etc. So we shouldn't issue these qom-get calls in
the "hot path" of QEMU startup. It can be done later in a non-time
critical point. Also the QEMU API for this is horribly inefficient to
require so many qom-get calls.

There's more but I won't talk about it now. Suffice to say that I think
we can get libvirt overhead down to less than 100 ms fairly easily and
probably even down to less than 50 ms without much effort.

The exact figure will depend on what libvirt features you want enabled,
and how much work we want/need to put into optimization. We'll want to
fix the really gross mistakes & slow downs, but we'll want guidance from
likely users as to their VM startup targets to decide how much work
needs investing.

This optimization will ultimately help non-embedded QEMU mode too,
making it faster to respond & start.

Changed in v4:

 - Prevent opening the embedded drivers many times with different
   root paths
 - Add docs warning about not running APIs from the event loop
   thread

Changed in v3:

 - Rebased to master
 - Merge some simple acked patches

Changed in v2:

 - Use a simplified directory layout for embedded mode. Previously we
   just put a dir prefix onto the normal paths. This has the downside
   that the embedded drivers paths are needlessly different for
   privileged vs unprivileged user. It also results in very long paths
   which can be a problem for the UNIX socket name length limits.

 - Also ported the secret driver to support embedded mode

 - Check to validate that the event loop is registered.

 - Add virt-qemu-run tool for embedded usage.

 - Added docs for the qemu & secret driver explaining embedded mode

Daniel P. Berrangé (6):
  util: add helper API for getting URI parameters
  libvirt: pass a directory path into drivers for embedded usage
  libvirt: support an "embed" URI path selector for opening drivers
  qemu: add support for running QEMU driver in embedded mode
  secrets: add support for running secret driver in embedded mode
  qemu: introduce a new "virt-qemu-run" program

 build-aux/syntax-check.mk               |   2 +-
 docs/Makefile.am                        |   5 +
 docs/drivers.html.in                    |   1 +
 docs/drvqemu.html.in                    |  99 ++++++++
 docs/drvsecret.html.in                  |  82 ++++++
 docs/manpages/index.rst                 |   1 +
 docs/manpages/virt-qemu-run.rst         | 114 +++++++++
 libvirt.spec.in                         |   2 +
 src/Makefile.am                         |   1 +
 src/driver-state.h                      |   2 +
 src/driver.h                            |   2 +
 src/interface/interface_backend_netcf.c |   7 +
 src/interface/interface_backend_udev.c  |   7 +
 src/libvirt.c                           |  93 ++++++-
 src/libvirt_internal.h                  |   4 +-
 src/libvirt_private.syms                |   1 +
 src/libxl/libxl_driver.c                |   7 +
 src/lxc/lxc_driver.c                    |   8 +
 src/network/bridge_driver.c             |   7 +
 src/node_device/node_device_hal.c       |   7 +
 src/node_device/node_device_udev.c      |   7 +
 src/nwfilter/nwfilter_driver.c          |   7 +
 src/qemu/Makefile.inc.am                |  13 +
 src/qemu/qemu_conf.c                    |  45 +++-
 src/qemu/qemu_conf.h                    |   8 +-
 src/qemu/qemu_driver.c                  |  34 ++-
 src/qemu/qemu_process.c                 |  15 +-
 src/qemu/qemu_shim.c                    | 322 ++++++++++++++++++++++++
 src/remote/remote_daemon.c              |   1 +
 src/remote/remote_driver.c              |   1 +
 src/secret/secret_driver.c              |  53 +++-
 src/storage/storage_driver.c            |   7 +
 src/util/viruri.c                       |  16 ++
 src/util/viruri.h                       |   2 +
 src/vz/vz_driver.c                      |   7 +
 tests/domaincapstest.c                  |   2 +-
 tests/testutilsqemu.c                   |   3 +-
 37 files changed, 967 insertions(+), 28 deletions(-)
 create mode 100644 docs/drvsecret.html.in
 create mode 100644 docs/manpages/virt-qemu-run.rst
 create mode 100644 src/qemu/qemu_shim.c

-- 
2.23.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Re: [PATCH v4 0/6] introduce support for an embedded driver mode

Posted by Daniel P. Berrangé 1 day ago
Ping

On Fri, Jan 10, 2020 at 10:34:24AM +0000, Daniel P. Berrangé wrote:
> This is a followup to:
> 
>  v1: https://www.redhat.com/archives/libvir-list/2019-May/msg00467.html
>  v2: https://www.redhat.com/archives/libvir-list/2019-December/msg00050.html
>  v3: https://www.redhat.com/archives/libvir-list/2019-December/msg01364.html
> 
> This series implements support for an embedded driver mode for libvirt,
> with initial support in the QEMU and secrets drivers.
> 
> In this mode of operation, the driver stores all its config and state
> under a private directory tree.  See the individual patches for the
> illustrated directory hierarchy used.
> 
> The intent of this embedded mode is to suit cases where the application
> is using virtualization as a building block for some functionality, as
> opposed to running traditional "full OS" builds.
> 
> The long time posterchild example would be libguestfs, while a more
> recent example could be Kata containers.
> 
> The general principal in enabling this embedded mode is that the
> functionality available should be identical to that seen when the
> driver is running inside libvirtd. This is achieved by loading the
> exact same driver .so module as libvirtd would load, and simply
> configuring it with a different directory layout.
> 
> The result of this is that when running in embedded mode, the driver
> can still talk to other secondary drivers running inside libvirtd
> if desired. This is useful, for example, to connect a VM to the
> default virtual network.
> 
> The secondary drivers can be made to operate in embedded mode as
> well, however, this will require some careful consideration for each
> driver to ensure they don't clash with each other. Thus in this series
> only the secret driver is enabled for embedded mode. This is required
> to enable use of VMs with encrypted disks, or authenticated network
> block storage.
> 
> In this series we introduce a new command line tool 'virt-qemu-run'
> which is a really simple tool for launching a VM in embedded mode.
> 
> I'm not entirely sure whether we should provide this as an official
> supported tool in this way, or merely put it into the 'examples'
> directory as demo-ware.
> 
> With testing of the virt-qemu-run tool we can immediately see what the
> next important thing to tackle is: performance. We have not really cared
> too much about the startup performance of libvirtd as this is a one time
> cost when the mgmt application connects. We did none the less cache
> capabilities because probing caps for 30 QEMU binaries takes a long time.
> 
> Even with this caching it takes an unacceptably long time to start a VM
> in embedded mode. About 100 ms to open the embedded QEMU driver,
> assuming pre-cached capabilies - ~2 seconds if not cached and all 30
> QEMU targets are present. Then about 300 ms to actually start the QEMU
> guest.
> 
> IOW, about 400 ms to get QEMU running. NB this is measuring time from
> launching the virt-run-qemu program, to the point at which the API call
> 'virDomainCreate' returns control. This has both libvirt & QEMU overhead
> in & I don't have clear figures to distinguish, but I can see a 40 ms
> delay between issuing the 'qmp_capabilities' call and getting a reply,
> which is QEMU startup overead.
> 
> This is a i440fx based QEMU with a general purpose virtio-pci config
> (disk, net, etc) tyupical for running a full OS. I've not tried any
> kind of optimized QEMU config with microvm.
> 
> I've already started on measuring & optimizing & identified several key
> areas that can be addressed, but it is all ultimately about not doing
> work before we need the answers from that work (which often means we
> will never do the work at all).
> 
> For example, we shouldn't probe all 30 QEMU's upfront. If the app is
> only going to create an x86_64 KVM guest we should only care about that
> 1 QEMU. This is painful because parsing any guest XML requires a
> virCapsPtr which in turn causes probing of every QEMU binary. I've got
> in progress patches to eliminate virCapsPtr almost entirely and work
> directly with the virQEMUCapsPtr instead.
> 
> It is possible we'll want to use a different file format for storing
> the cached QEMU capabilities, and the CPU feature/model info. Parsing
> this XML is a non-negligible time sink. A binary format is likely way
> quicker, especially if its designed to be just mmap'able for direct
> read. To be investigated...
> 
> We shouldn't probe for whether host PM suspend is possible unless
> someone wants that info, or tries to issue that API call.
> 
> After starting QEMU we spend 150-200 ms issuing a massive number of
> qom-get calls to check whether QEMU enabled each individual CPU feature
> flag. We only need this info if someone asks for the live XML or we
> intend to live migrate etc. So we shouldn't issue these qom-get calls in
> the "hot path" of QEMU startup. It can be done later in a non-time
> critical point. Also the QEMU API for this is horribly inefficient to
> require so many qom-get calls.
> 
> There's more but I won't talk about it now. Suffice to say that I think
> we can get libvirt overhead down to less than 100 ms fairly easily and
> probably even down to less than 50 ms without much effort.
> 
> The exact figure will depend on what libvirt features you want enabled,
> and how much work we want/need to put into optimization. We'll want to
> fix the really gross mistakes & slow downs, but we'll want guidance from
> likely users as to their VM startup targets to decide how much work
> needs investing.
> 
> This optimization will ultimately help non-embedded QEMU mode too,
> making it faster to respond & start.
> 
> Changed in v4:
> 
>  - Prevent opening the embedded drivers many times with different
>    root paths
>  - Add docs warning about not running APIs from the event loop
>    thread
> 
> Changed in v3:
> 
>  - Rebased to master
>  - Merge some simple acked patches
> 
> Changed in v2:
> 
>  - Use a simplified directory layout for embedded mode. Previously we
>    just put a dir prefix onto the normal paths. This has the downside
>    that the embedded drivers paths are needlessly different for
>    privileged vs unprivileged user. It also results in very long paths
>    which can be a problem for the UNIX socket name length limits.
> 
>  - Also ported the secret driver to support embedded mode
> 
>  - Check to validate that the event loop is registered.
> 
>  - Add virt-qemu-run tool for embedded usage.
> 
>  - Added docs for the qemu & secret driver explaining embedded mode
> 
> Daniel P. Berrangé (6):
>   util: add helper API for getting URI parameters
>   libvirt: pass a directory path into drivers for embedded usage
>   libvirt: support an "embed" URI path selector for opening drivers
>   qemu: add support for running QEMU driver in embedded mode
>   secrets: add support for running secret driver in embedded mode
>   qemu: introduce a new "virt-qemu-run" program
> 
>  build-aux/syntax-check.mk               |   2 +-
>  docs/Makefile.am                        |   5 +
>  docs/drivers.html.in                    |   1 +
>  docs/drvqemu.html.in                    |  99 ++++++++
>  docs/drvsecret.html.in                  |  82 ++++++
>  docs/manpages/index.rst                 |   1 +
>  docs/manpages/virt-qemu-run.rst         | 114 +++++++++
>  libvirt.spec.in                         |   2 +
>  src/Makefile.am                         |   1 +
>  src/driver-state.h                      |   2 +
>  src/driver.h                            |   2 +
>  src/interface/interface_backend_netcf.c |   7 +
>  src/interface/interface_backend_udev.c  |   7 +
>  src/libvirt.c                           |  93 ++++++-
>  src/libvirt_internal.h                  |   4 +-
>  src/libvirt_private.syms                |   1 +
>  src/libxl/libxl_driver.c                |   7 +
>  src/lxc/lxc_driver.c                    |   8 +
>  src/network/bridge_driver.c             |   7 +
>  src/node_device/node_device_hal.c       |   7 +
>  src/node_device/node_device_udev.c      |   7 +
>  src/nwfilter/nwfilter_driver.c          |   7 +
>  src/qemu/Makefile.inc.am                |  13 +
>  src/qemu/qemu_conf.c                    |  45 +++-
>  src/qemu/qemu_conf.h                    |   8 +-
>  src/qemu/qemu_driver.c                  |  34 ++-
>  src/qemu/qemu_process.c                 |  15 +-
>  src/qemu/qemu_shim.c                    | 322 ++++++++++++++++++++++++
>  src/remote/remote_daemon.c              |   1 +
>  src/remote/remote_driver.c              |   1 +
>  src/secret/secret_driver.c              |  53 +++-
>  src/storage/storage_driver.c            |   7 +
>  src/util/viruri.c                       |  16 ++
>  src/util/viruri.h                       |   2 +
>  src/vz/vz_driver.c                      |   7 +
>  tests/domaincapstest.c                  |   2 +-
>  tests/testutilsqemu.c                   |   3 +-
>  37 files changed, 967 insertions(+), 28 deletions(-)
>  create mode 100644 docs/drvsecret.html.in
>  create mode 100644 docs/manpages/virt-qemu-run.rst
>  create mode 100644 src/qemu/qemu_shim.c
> 
> -- 
> 2.23.0
> 

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|