[libvirt] [PATCHv3 10/10] qemu: improve efficiency of dd during snapshots

Eric Blake eblake at redhat.com
Fri Mar 4 00:37:55 UTC 2011


POSIX states about dd:

If the bs=expr operand is specified and no conversions other than
sync, noerror, or notrunc are requested, the data returned from each
input block shall be written as a separate output block; if the read
returns less than a full block and the sync conversion is not
specified, the resulting output block shall be the same size as the
input block. If the bs=expr operand is not specified, or a conversion
other than sync, noerror, or notrunc is requested, the input shall be
processed and collected into full-sized output blocks until the end of
the input is reached.

Since we aren't using conv=sync, there is no zero-padding, but our
use of bs= means that a short read results in a short write.  If
instead we use ibs= and obs=, then short reads are collected and dd
only has to do a single write, which can make dd more efficient.

* src/qemu/qemu_monitor_text.c (qemuMonitorTextMigrateToFile):
Avoid 'dd bs=', since it can cause short writes.
* src/qemu/qemu_monitor_json.c (qemuMonitorJSONMigrateToFile):
Likewise.
---

no changes in v3: I've had this one sitting around for a while;
technically, this is less important now that we're avoiding exec:
with newer qemu, but it is still useful for qemu 0.11.0.

 src/qemu/qemu_monitor_json.c |    3 ++-
 src/qemu/qemu_monitor_text.c |    3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 81201ff..5fb43b0 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1794,10 +1794,11 @@ int qemuMonitorJSONMigrateToFile(qemuMonitorPtr mon,
      * <> redirection to avoid truncating a regular file.  */
     if (virAsprintf(&dest, "exec:" VIR_WRAPPER_SHELL_PREFIX "%s | "
                     "{ dd bs=%llu seek=%llu if=/dev/null && "
-                    "dd bs=%llu; } 1<>%s" VIR_WRAPPER_SHELL_SUFFIX,
+                    "dd ibs=%llu obs=%llu; } 1<>%s" VIR_WRAPPER_SHELL_SUFFIX,
                     argstr, QEMU_MONITOR_MIGRATE_TO_FILE_BS,
                     offset / QEMU_MONITOR_MIGRATE_TO_FILE_BS,
                     QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
+                    QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
                     safe_target) < 0) {
         virReportOOMError();
         goto cleanup;
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 76e0ec0..3c9f799 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1369,10 +1369,11 @@ int qemuMonitorTextMigrateToFile(qemuMonitorPtr mon,
      * <> redirection to avoid truncating a regular file.  */
     if (virAsprintf(&dest, "exec:" VIR_WRAPPER_SHELL_PREFIX "%s | "
                     "{ dd bs=%llu seek=%llu if=/dev/null && "
-                    "dd bs=%llu; } 1<>%s" VIR_WRAPPER_SHELL_SUFFIX,
+                    "dd ibs=%llu obs=%llu; } 1<>%s" VIR_WRAPPER_SHELL_SUFFIX,
                     argstr, QEMU_MONITOR_MIGRATE_TO_FILE_BS,
                     offset / QEMU_MONITOR_MIGRATE_TO_FILE_BS,
                     QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
+                    QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE,
                     safe_target) < 0) {
         virReportOOMError();
         goto cleanup;
-- 
1.7.4




More information about the libvir-list mailing list