[libvirt] [PATCH 00/30] conf: eliminate use of virCapsPtr for parsing/formatting XML

Michal Privoznik mprivozn at redhat.com
Fri Dec 6 07:54:48 UTC 2019


On 12/4/19 3:20 PM, Daniel P. Berrangé wrote:
> The virCapsPtr object is a serious source of performance problems for
> the QEMU driver, because populating it means probing every QEMU system
> emulator binary installed on the host.
> 
> This is is crazy because parsing any single XML document only ever needs
> information about a single QEMU binary.
> 
> We've already done a great job of untangling stuff with the post-parse
> and validation functions, but the job was never quite finished. This
> series tackles the last pieces so that parsing & formatting XML will
> never use the virCapsPtr object directly. Some of the virt drivers will
> still use virCapsPtr in their private callbacks, but the QEMU driver
> will instead use the QEMU emulator capabilities cache directly.
> 
> The first ten patches are the key bits of work to remove use of the
> virCapsPtr parameter from domain XML APIs.
> 
> The next thirteen patches remove the (now unused) virCapsPtr parameter
> from the domain XML APIs & their callers.
> 
> The final six patches help various QEMU driver APIs stop relying
> on the virCapsPtr, so that it is no longer even created at startup.
> 
> This has a nice benefit on libvirtd startup tie when all 30 QEMU
> emulators are installed, reducing it from 4 seconds down to a
> fraction of a second.
> 
> More work is still needed to follow on from this...
> 
> A couple of places in the QEMU driver still use virCapsPtr
> 
>   - The virConnectGetVersion API.
>   - The virNodeGetSecurityModel API.
>   - virDomainGetResctrlMonData API.
> 
> In all cases we just need to move to store the relevant data directly
> in virQEMUDriverPtr, and not use the virCaps.
> 
> 
> next, apps can use virDomainGetCapabilities to fetch info about a
> specific QEMU binary they care about to avoid the cost of the
> virConnectGetCapabilities API.
> 
> There are still times when apps need info in virConnectGetCapabilities
> and this will annoyingly probe all QEMU binaries, even though the app
> doesn't want the guest info.
> 
> virConnectGetCapabilities is one of our very early APIs which now flags
> parameter, so this problem is unfixable in that API.
> 
> I'm thus included to introduce a new virNodeGetCapabilities that is
> specifically only returning information about the host hypervisor.
> Essentially the <capabilities> schema, but only the <host> sub-tree.
> 
> I do, however, wonder if even this is overkill & we should aim for a
> much more fine grained way for reporting host capabilities.
> 
> eg if an app wants the host CPU, do they really want to pay the
> penality to probe host cache nformation, or NUMA topology and
> vica-verca.
> 
> I'm not sure what the right kind of tradeoff here is, whether we should
> try individual APIs, or have one API and a set of flags to control what
> info is filled in.
> 
> Daniel P. Berrangé (30):
>    qemu: cache host arch separately from virCapsPtr
>    qemu: add machines & arch to fake test capabilities cache
>    conf: sanitize virDomainSaveStatus & virDomainSaveConfig APIs
>    conf: sanitize virDomainObjFormat & virDomainDefFormat* APIs
>    conf: pass in default architecture via domain XML options
>    conf: move virt type / os type / arch validation to post-parse
>    conf: don't use passed in caps in post parse method
>    conf: pass netprefix in the domain parser config struct
>    conf: move seclabel validation into post-parse phase
>    conf: pass default sec model in parser config
>    conf: drop virCapsPtr param from assign addresses callback
>    conf: drop virCapsPtr param from basic post parse callback
>    conf: drop virCapsPtr param from post parse data alloc callback
>    conf: drop virCapsPtr param from post parse callback
>    conf: drop virCapsPtr param from device post parse callback
>    conf: drop virCapsPtr param from domain validate callback
>    conf: drop virCapsPtr param from domain formatting APIs
>    conf: drop virCapsPtr param from domain post parse & validate APIs
>    conf: drop virCapsPtr param from domain parse APIs
>    conf: drop virCapsPtr param from domain APIs for copying config
>    conf: drop virCapsPtr param from APIs for saving domains
>    conf: drop virCapsPtr param from domain obj list APIs
>    conf: drop virCapsPtr param from snapshot & checkpoint APIs
>    qemu: drop virCapsPtr param & vars from many APIs
>    conf: move NUMA capabilities into self contained object
>    qemu: use NUMA capabilities object directly
>    conf: make virCPUDef into a ref counted struct
>    qemu: use host CPU object directly
>    qemu: directly create virResctrlInfo ignoring capabilities
>    qemu: stop creating capabilities at driver startup
> 
>   docs/formatdomain.html.in               |   6 +-
>   src/bhyve/bhyve_domain.c                |  16 +-
>   src/bhyve/bhyve_driver.c                |  46 +-
>   src/bhyve/bhyve_process.c               |  22 +-
>   src/conf/capabilities.c                 | 217 +++++---
>   src/conf/capabilities.h                 |  34 +-
>   src/conf/checkpoint_conf.c              |  21 +-
>   src/conf/checkpoint_conf.h              |   2 -
>   src/conf/cpu_conf.c                     |  29 +-
>   src/conf/cpu_conf.h                     |   4 +
>   src/conf/domain_conf.c                  | 404 ++++++--------
>   src/conf/domain_conf.h                  |  84 ++-
>   src/conf/snapshot_conf.c                |  28 +-
>   src/conf/snapshot_conf.h                |   3 -
>   src/conf/virconftypes.h                 |   3 +
>   src/conf/virdomainobjlist.c             |   9 +-
>   src/conf/virdomainobjlist.h             |   1 -
>   src/cpu/cpu.c                           |   3 +-
>   src/cpu/cpu_arm.c                       |   5 +-
>   src/cpu/cpu_ppc64.c                     |   3 +-
>   src/cpu/cpu_x86.c                       |   6 +-
>   src/esx/esx_driver.c                    |  14 +-
>   src/hyperv/hyperv_driver.c              |   1 +
>   src/libvirt_private.syms                |  18 +-
>   src/libxl/libxl_capabilities.c          |  23 +-
>   src/libxl/libxl_conf.c                  |   3 +-
>   src/libxl/libxl_conf.h                  |   2 +-
>   src/libxl/libxl_domain.c                |  37 +-
>   src/libxl/libxl_driver.c                |  83 ++-
>   src/libxl/libxl_migration.c             |  20 +-
>   src/libxl/xen_xl.c                      |  13 +-
>   src/libxl/xen_xm.c                      |   2 +-
>   src/lxc/lxc_conf.c                      |   9 +-
>   src/lxc/lxc_conf.h                      |   2 +-
>   src/lxc/lxc_controller.c                |  44 +-
>   src/lxc/lxc_domain.c                    |  13 +-
>   src/lxc/lxc_driver.c                    |  98 ++--
>   src/lxc/lxc_native.c                    |   4 +-
>   src/lxc/lxc_process.c                   |  20 +-
>   src/openvz/openvz_conf.c                |  62 ++-
>   src/openvz/openvz_conf.h                |   1 +
>   src/openvz/openvz_driver.c              |  64 +--
>   src/phyp/phyp_driver.c                  |  26 +-
>   src/qemu/qemu_capabilities.c            | 176 ++++---
>   src/qemu/qemu_capabilities.h            |  12 +-
>   src/qemu/qemu_capspriv.h                |  10 +
>   src/qemu/qemu_checkpoint.c              |  32 +-
>   src/qemu/qemu_checkpoint.h              |   1 -
>   src/qemu/qemu_command.c                 |   6 +-
>   src/qemu/qemu_conf.c                    |  57 +-
>   src/qemu/qemu_conf.h                    |  18 +-
>   src/qemu/qemu_domain.c                  | 108 ++--
>   src/qemu/qemu_domain.h                  |   1 -
>   src/qemu/qemu_driver.c                  | 293 ++++-------
>   src/qemu/qemu_hotplug.c                 |   8 +-
>   src/qemu/qemu_migration.c               |  36 +-
>   src/qemu/qemu_migration_cookie.c        |   8 +-
>   src/qemu/qemu_process.c                 | 196 +++----
>   src/security/virt-aa-helper.c           |   2 +-
>   src/test/test_driver.c                  |  45 +-
>   src/util/virresctrl.h                   |   2 +
>   src/vbox/vbox_common.c                  |  16 +-
>   src/vmware/vmware_conf.c                |   2 +-
>   src/vmware/vmware_driver.c              |  25 +-
>   src/vmx/vmx.c                           |  23 +-
>   src/vmx/vmx.h                           |   2 +-
>   src/vz/vz_driver.c                      |  29 +-
>   tests/Makefile.am                       |  17 +-
>   tests/bhyveargv2xmltest.c               |   2 +-
>   tests/bhyvexml2argvtest.c               |   2 +-
>   tests/cputest.c                         |  11 +-
>   tests/domaincapstest.c                  |  14 +-
>   tests/domainconftest.c                  |   2 +-
>   tests/libxlxml2domconfigtest.c          |  22 +-
>   tests/lxcconf2xmltest.c                 |  17 +-
>   tests/lxcxml2xmltest.c                  |  13 +-
>   tests/openvzutilstest.c                 |   8 +-
>   tests/qemuagenttest.c                   |   2 +-
>   tests/qemublocktest.c                   |   2 +-
>   tests/qemucapabilitiestest.c            |   9 +-
>   tests/qemudomaincheckpointxml2xmltest.c |   4 +-
>   tests/qemudomainsnapshotxml2xmltest.c   |   4 +-
>   tests/qemuhotplugtest.c                 |  11 +-
>   tests/qemumemlocktest.c                 |   6 +-
>   tests/qemusecuritytest.c                |   1 -
>   tests/qemuxml2argvtest.c                |  35 +-
>   tests/qemuxml2xmltest.c                 |   4 +-
>   tests/securityselinuxlabeltest.c        |   2 +-
>   tests/testutils.c                       |  39 +-
>   tests/testutils.h                       |   5 +-
>   tests/testutilslxc.c                    |  34 +-
>   tests/testutilslxc.h                    |   4 +
>   tests/testutilsqemu.c                   | 670 +++++++-----------------
>   tests/testutilsqemu.h                   |   9 +-
>   tests/testutilsxen.c                    |  34 +-
>   tests/testutilsxen.h                    |   9 +-
>   tests/vircaps2xmltest.c                 |   6 +-
>   tests/vircapstest.c                     |  11 +-
>   tests/vmx2xmltest.c                     |   4 +-
>   tests/xlconfigtest.c                    |  27 +-
>   tests/xmconfigtest.c                    |  23 +-
>   tests/xml2vmxtest.c                     |   4 +-
>   102 files changed, 1687 insertions(+), 1993 deletions(-)
> 

Reviewed-by: Michal Privoznik <mprivozn at redhat.com>

Michal




More information about the libvir-list mailing list