[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v11 0/3] VM forking



On Fri, Feb 28, 2020 at 11:41 AM Tamas K Lengyel
<tamas.lengyel@xxxxxxxxx> wrote:
>
> The following series implements VM forking for Intel HVM guests to allow for
> the fast creation of identical VMs without the assosciated high startup costs
> of booting or restoring the VM from a savefile.
>
> JIRA issue: https://xenproject.atlassian.net/browse/XEN-89
>
> The fork operation is implemented as part of the "xl fork-vm" command:
>     xl fork-vm -C <config> -Q <qemu-save-file> -m <max-vcpus> <parent_domid>
>
> By default a fully functional fork is created. The user is in charge however 
> to
> create the appropriate config file for the fork and to generate the QEMU save
> file before the fork-vm call is made. The config file needs to give the
> fork a new name at minimum but other settings may also require changes. 
> Certain
> settings in the config file of both the parent and the fork have to be set to
> default. Details are documented.
>
> The interface also allows to split the forking into two steps:
>     xl fork-vm --launch-dm no \
>                -m <max-vcpus> \
>                -p <parent_domid>
>     xl fork-vm --launch-dm late \
>                -C <config_file_for_fork> \
>                -Q <qemu_save_file> \
>                <fork_domid>
>
> The split creation model is useful when the VM needs to be created as fast as
> possible. The forked VM can be unpaused without the device model being 
> launched
> to be monitored and accessed via VMI. Note however that without its device
> model running (depending on what is executing in the VM) it is bound to
> misbehave or even crash when its trying to access devices that would be
> emulated by QEMU. We anticipate that for certain use-cases this would be an
> acceptable situation, in case for example when fuzzing is performed of code
> segments that don't access such devices.
>
> Launching the device model requires the QEMU Xen savefile to be generated
> manually from the parent VM. This can be accomplished simply by connecting to
> its QMP socket and issuing the "xen-save-devices-state" command. For example
> using the standard tool socat these commands can be used to generate the file:
>     socat - UNIX-CONNECT:/var/run/xen/qmp-libxl-<parent_domid>
>     { "execute": "qmp_capabilities" }
>     { "execute": "xen-save-devices-state", \
>         "arguments": { "filename": "/path/to/save/qemu_state", \
>                         "live": false} }
>
> At runtime the forked VM starts running with an empty p2m which gets lazily
> populated when the VM generates EPT faults, similar to how altp2m views are
> populated. If the memory access is a read-only access, the p2m entry is
> populated with a memory shared entry with its parent. For write memory 
> accesses
> or in case memory sharing wasn't possible (for example in case a reference is
> held by a third party), a new page is allocated and the page contents are
> copied over from the parent VM. Forks can be further forked if needed, thus
> allowing for further memory savings.
>
> A VM fork reset hypercall is also added that allows the fork to be reset to 
> the
> state it was just after a fork, also accessible via xl:
>     xl fork-vm --fork-reset -p <fork_domid>
>
> This is an optimization for cases where the forks are very short-lived and run
> without a device model, so resetting saves some time compared to creating a
> brand new fork provided the fork has not aquired a lot of memory. If the fork
> has a lot of memory deduplicated it is likely going to be faster to create a
> new fork from scratch and asynchronously destroying the old one.
>
> The series has been tested with Windows VMs and functions as expected. Linux
> VMs when forked from a running VM will have a frozen VNC screen. Linux VMs at
> this time can only be forked with a working device model when the parent VM 
> was
> restored from a snapshot using "xl restore -p". This is a known limitation.
> Also note that PVHVM/PVH Linux guests have not been tested. Forking most 
> likely
> works but PV devices and drivers would require additional wiring to set things
> up properly since the guests are unaware of the forking taking place, unlike
> the save/restore routine where the guest is made aware of the procedure.
>
> Forking time has been measured to be 0.0007s, device model launch to be around
> 1s depending largely on the number of devices being emulated. Fork resets have
> been measured to be 0.0001s under the optimal circumstances.
>
> New in v11:
>     Fully copy & reset vcpu_info pages
>     Setup vcpu_runstate for forks
>     Added TODO note for PV timers
>     Copy & reset shared_info page
>     Copy & reset HVM special pages
>
> New in v10:
>     Rebased on staging and minor fixes for things pointed out by Roger
>     Allocate pages for vcpu_info if used by parent
>     Document limitation of guest settings that have to be set to default
>     Require max-vcpus to be specified by toolstack-side
>     Code movement in toolstack & compile tested on ARM
>     Implement hypercall continuation for reset operation
>
> Patch 1-2 implements the VM fork & reset operation hypervisor side bits
>
> Patch 3 adds the toolstack-side code implementing VM forking and reset
>
> Tamas K Lengyel (3):
>   xen/mem_sharing: VM forking
>   x86/mem_sharing: reset a fork
>   xen/tools: VM forking toolstack side
>
>  docs/man/xl.1.pod.in              |  44 +++
>  tools/libxc/include/xenctrl.h     |  13 +
>  tools/libxc/xc_memshr.c           |  22 ++
>  tools/libxl/libxl.h               |  11 +
>  tools/libxl/libxl_create.c        | 361 ++++++++++++----------
>  tools/libxl/libxl_dm.c            |   2 +-
>  tools/libxl/libxl_dom.c           |  43 ++-
>  tools/libxl/libxl_internal.h      |   7 +
>  tools/libxl/libxl_types.idl       |   1 +
>  tools/libxl/libxl_x86.c           |  41 +++
>  tools/xl/Makefile                 |   2 +-
>  tools/xl/xl.h                     |   5 +
>  tools/xl/xl_cmdtable.c            |  15 +
>  tools/xl/xl_forkvm.c              | 147 +++++++++
>  tools/xl/xl_vmcontrol.c           |  14 +
>  xen/arch/x86/domain.c             |  11 +
>  xen/arch/x86/hvm/hvm.c            |   4 +-
>  xen/arch/x86/mm/hap/hap.c         |   3 +-
>  xen/arch/x86/mm/mem_sharing.c     | 483 ++++++++++++++++++++++++++++++
>  xen/arch/x86/mm/p2m.c             |   9 +-
>  xen/common/domain.c               |   3 +
>  xen/include/asm-x86/hap.h         |   1 +
>  xen/include/asm-x86/hvm/hvm.h     |   2 +
>  xen/include/asm-x86/mem_sharing.h |  17 ++
>  xen/include/public/memory.h       |   9 +
>  xen/include/xen/sched.h           |   5 +
>  26 files changed, 1104 insertions(+), 171 deletions(-)
>  create mode 100644 tools/xl/xl_forkvm.c

Patch series ping. There hasn't been any comments on this in the last
three weeks.

Thanks,
Tamas

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.