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

[libvirt] [PATCH] support compressed crashdump of guests



Now, virsh dump doesn't support compresses dump.
This patch adds GZIP and LZOP option to virsh dump and support
it at qemu coredump. (AFAIK, LZOP is available on RHEL6.)

When I did 4G guest dump,
(Raw)	3844669750 
(Gzip)	1029846577
(LZOP)	1416263880 (faster than gzip in general)

This will be a help for a host where crash-dump is used
and several guests works on it.

help message is modified as this.
  NAME
    dump - dump the core of a domain to a file for analysis

  SYNOPSIS
    dump [--live] [--crash] [--gzip] [--lzop] <domain> <file>

  DESCRIPTION
    Core dump a domain.

  OPTIONS
    --live           perform a live core dump if supported
    --crash          crash the domain after core dump
    --gzip           gzip dump(only one compression allowed
    --lzop           lzop dump(only one compression allowed
    [--domain] <string>  domain name, id or uuid
    [--file] <string>  where to dump the core

Tested on Fedora-13+x86-64.

Note: for better compression, we may have to skip pages filled by
zero or freed pages. But it seems it's qemu's works.

Signed-off-by: KAMEZAWA Hiroyuki <kamezawa hiroyu jp fujitsu com>
---
 include/libvirt/libvirt.h.in |    2 ++
 src/qemu/qemu_driver.c       |   23 +++++++++++++++++++----
 tools/virsh.c                |   10 +++++++++-
 3 files changed, 30 insertions(+), 5 deletions(-)

Index: libvirt-0.8.4/src/qemu/qemu_driver.c
===================================================================
--- libvirt-0.8.4.orig/src/qemu/qemu_driver.c
+++ libvirt-0.8.4/src/qemu/qemu_driver.c
@@ -5710,7 +5710,7 @@ cleanup:
 
 static int qemudDomainCoreDump(virDomainPtr dom,
                                const char *path,
-                               int flags ATTRIBUTE_UNUSED) {
+                               int flags) {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
     int resume = 0, paused = 0;
@@ -5720,6 +5720,14 @@ static int qemudDomainCoreDump(virDomain
         "cat",
         NULL,
     };
+    const char *zargs[] = {
+	"gzip",
+	NULL,
+    };
+    const char *lzargs[] = {
+	"lzop",
+	NULL,
+    };
     qemuDomainObjPrivatePtr priv;
 
     qemuDriverLock(driver);
@@ -5787,9 +5795,16 @@ static int qemudDomainCoreDump(virDomain
     }
 
     qemuDomainObjEnterMonitorWithDriver(driver, vm);
-    ret = qemuMonitorMigrateToFile(priv->mon,
-                                   QEMU_MONITOR_MIGRATE_BACKGROUND,
-                                   args, path, 0);
+    if (flags & VIR_DUMP_GZIP)
+	ret = qemuMonitorMigrateToFile(priv->mon,
+		QEMU_MONITOR_MIGRATE_BACKGROUND, zargs, path, 0);
+    else if (flags & VIR_DUMP_LZOP)
+	ret = qemuMonitorMigrateToFile(priv->mon,
+		QEMU_MONITOR_MIGRATE_BACKGROUND, lzargs, path, 0);
+    else
+	ret = qemuMonitorMigrateToFile(priv->mon,
+		QEMU_MONITOR_MIGRATE_BACKGROUND, args, path, 0);
+
     qemuDomainObjExitMonitorWithDriver(driver, vm);
     if (ret < 0)
         goto endjob;
Index: libvirt-0.8.4/tools/virsh.c
===================================================================
--- libvirt-0.8.4.orig/tools/virsh.c
+++ libvirt-0.8.4/tools/virsh.c
@@ -1751,6 +1751,8 @@ static const vshCmdInfo info_dump[] = {
 static const vshCmdOptDef opts_dump[] = {
     {"live", VSH_OT_BOOL, 0, N_("perform a live core dump if supported")},
     {"crash", VSH_OT_BOOL, 0, N_("crash the domain after core dump")},
+    {"gzip", VSH_OT_BOOL, 0, N_("gzip dump(only one compression allowed")},
+    {"lzop", VSH_OT_BOOL, 0, N_("lzop dump(only one compression allowed")},
     {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or uuid")},
     {"file", VSH_OT_DATA, VSH_OFLAG_REQ, N_("where to dump the core")},
     {NULL, 0, 0, NULL}
@@ -1778,7 +1780,13 @@ cmdDump(vshControl *ctl, const vshCmd *c
         flags |= VIR_DUMP_LIVE;
     if (vshCommandOptBool (cmd, "crash"))
         flags |= VIR_DUMP_CRASH;
-
+    if (vshCommandOptBool (cmd, "gzip"))
+	flags |= VIR_DUMP_GZIP;
+    if (vshCommandOptBool (cmd, "lzop"))
+        flags |= VIR_DUMP_LZOP;
+    if ((flags & (VIR_DUMP_GZIP | VIR_DUMP_LZOP))
+	 == (VIR_DUMP_GZIP | VIR_DUMP_LZOP))
+	return FALSE;
     if (virDomainCoreDump(dom, to, flags) == 0) {
         vshPrint(ctl, _("Domain %s dumped to %s\n"), name, to);
     } else {
Index: libvirt-0.8.4/include/libvirt/libvirt.h.in
===================================================================
--- libvirt-0.8.4.orig/include/libvirt/libvirt.h.in
+++ libvirt-0.8.4/include/libvirt/libvirt.h.in
@@ -402,6 +402,8 @@ typedef virDomainMemoryStatStruct *virDo
 typedef enum {
     VIR_DUMP_CRASH   = (1 << 0), /* crash after dump */
     VIR_DUMP_LIVE    = (1 << 1), /* live dump */
+    VIR_DUMP_GZIP    = (1 << 2), /* gzip dump file */
+    VIR_DUMP_LZOP    = (1 << 3), /* lzop dump file */
 } virDomainCoreDumpFlags;
 
 /* Domain migration flags. */


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