[PATCH RFC 0/9] qemu: Support mapped-ram migration capability

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

 



This series is a RFC for support of QEMU's mapped-ram migration
capability [1] for saving and restoring VMs. It implements the first
part of the design approach we discussed for supporting parallel
save/restore [2]. In summary, the approach is

1. Add mapped-ram migration capability
2. Steal an element from save header 'unused' for a 'features' variable
   and bump save version to 3.
3. Add /etc/libvirt/qemu.conf knob for the save format version,
   defaulting to latest v3
4. Use v3 (aka mapped-ram) by default
5. Use mapped-ram with BYPASS_CACHE for v3, old approach for v2
6. include: Define constants for parallel save/restore
7. qemu: Add support for parallel save. Implies mapped-ram, reject if v2
8. qemu: Add support for parallel restore. Implies mapped-ram.
   Reject if v2
9. tools: add parallel parameter to virsh save command
10. tools: add parallel parameter to virsh restore command

This series implements 1-5, with the BYPASS_CACHE support in patches 8
and 9 being quite hacky. They are included to discuss approaches to make
them less hacky. See the patches for details.

The QEMU mapped-ram capability currently does not support directio.
Fabino is working on that now [3]. This complicates merging support
in libvirt. I don't think it's reasonable to enable mapped-ram by
default when BYPASS_CACHE cannot be supported. Should we wait until
the mapped-ram directio support is merged in QEMU before supporting
mapped-ram in libvirt?

For the moment, compression is ignored in the new save version.
Currently, libvirt connects the output of QEMU's save stream to the
specified compression program via a pipe. This approach is incompatible
with mapped-ram since the fd provided to QEMU must be seekable. One
option is to reopen and compress the saved image after the actual save
operation has completed. This has the downside of requiring the iohelper
to handle BYPASS_CACHE, which would preclude us from removing it
sometime in the future. Other suggestions much welcomed.

Note the logical file size of mapped-ram saved images is slightly
larger than guest RAM size, so the files are often much larger than the
files produced by the existing, sequential format. However, actual blocks
written to disk is often lower with mapped-ram saved images. E.g. a saved
image from a 30G, freshly booted, idle guest results in the following
'Size' and 'Blocks' values reported by stat(1)

                 Size         Blocks
sequential     998595770      1950392
mapped-ram     34368584225    1800456

With the same guest running a workload that dirties memory

                 Size         Blocks
sequential     33173330615    64791672
mapped-ram     34368578210    64706944

Thanks for any comments on this RFC!

[1] https://gitlab.com/qemu-project/qemu/-/blob/master/docs/devel/migration/mapped-ram.rst?ref_type=heads
[2] https://lists.libvirt.org/archives/list/devel@xxxxxxxxxxxxxxxxx/message/K4BDDJDMJ22XMJEFAUE323H5S5E47VQX/
[3] https://mail.gnu.org/archive/html/qemu-devel/2024-05/msg04432.html

Jim Fehlig (9):
  qemu: Enable mapped-ram migration capability
  qemu_fd: Add function to retrieve fdset ID
  qemu: Add function to get migration params for save
  qemu: Add a 'features' element to save image header and bump version
  qemu: conf: Add setting for save image version
  qemu: Add support for mapped-ram on save
  qemu: Enable mapped-ram on restore
  qemu: Support O_DIRECT with mapped-ram on save
  qemu: Support O_DIRECT with mapped-ram on restore

 src/qemu/libvirtd_qemu.aug         |   1 +
 src/qemu/qemu.conf.in              |   6 +
 src/qemu/qemu_conf.c               |   8 ++
 src/qemu/qemu_conf.h               |   1 +
 src/qemu/qemu_driver.c             |  25 ++--
 src/qemu/qemu_fd.c                 |  18 +++
 src/qemu/qemu_fd.h                 |   3 +
 src/qemu/qemu_migration.c          |  99 ++++++++++++++-
 src/qemu/qemu_migration.h          |  11 +-
 src/qemu/qemu_migration_params.c   |  20 +++
 src/qemu/qemu_migration_params.h   |   4 +
 src/qemu/qemu_monitor.c            |  40 ++++++
 src/qemu/qemu_monitor.h            |   5 +
 src/qemu/qemu_process.c            |  63 +++++++---
 src/qemu/qemu_process.h            |  16 ++-
 src/qemu/qemu_saveimage.c          | 187 +++++++++++++++++++++++------
 src/qemu/qemu_saveimage.h          |  20 ++-
 src/qemu/qemu_snapshot.c           |  12 +-
 src/qemu/test_libvirtd_qemu.aug.in |   1 +
 19 files changed, 455 insertions(+), 85 deletions(-)

-- 
2.44.0



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux