virt-v2v/0043-input-Document-my-findings-with-nbdkit-noextents-fil.patch
Richard W.M. Jones 96cc493c74 Turn live domain error into a warning
resolves: RHEL-88543
Remove usage of nbdkit-cacheextents-filter
resolves: RHEL-88857
Print better mountpoint stats in debug output
resolves: RHEL-88861
Add virt-v2v -io vddk-noextents=true so we can test noextents
resolves: RHEL-88863
Remove several ancient, deprecated options
resolves: RHEL-88866
2025-04-29 15:06:30 +01:00

56 lines
2.4 KiB
Diff

From 65a9c8ed09f4cd04ae2176b48c4c9c1f69b08399 Mon Sep 17 00:00:00 2001
From: "Richard W.M. Jones" <rjones@redhat.com>
Date: Tue, 29 Apr 2025 10:42:46 +0100
Subject: [PATCH] input: Document my findings with nbdkit-noextents-filter
This just adds a comment, so makes no change.
(cherry picked from commit 29fae7985eda1d1cf3e176f123a16b60cac2db53)
---
input/nbdkit_vddk.ml | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/input/nbdkit_vddk.ml b/input/nbdkit_vddk.ml
index b79c28cc..3ba00d55 100644
--- a/input/nbdkit_vddk.ml
+++ b/input/nbdkit_vddk.ml
@@ -140,6 +140,38 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
*)
Nbdkit.add_filter_if_available cmd "retry";
+ (* VDDK's QueryAllocatedBlocks API is infamously slow. It appears
+ * to block all other requests while it is running. This API is
+ * also only called during the copy phase, not during conversion
+ * (or if it is, extremely rarely).
+ *
+ * If fstrim was successful, then trimmed blocks are stored in
+ * the COW filter (see below), and so requests for extents stop
+ * at that layer. However for areas of the disk that fstrim
+ * thinks contain data, we still have to go through to VDDK to
+ * fetch extents.
+ *
+ * We could therefore add nbdkit-noextents-filter here (below COW,
+ * above VDDK plugin) which stops extents requests from going
+ * to VDDK, which would stop QueryAllocatedBlocks ever being
+ * called. In my testing this is a moderate performance win.
+ *
+ * However ... in the case where fstrim failed, or for filesystems
+ * or partitions on the disk that we don't understand, doing this
+ * would mean that those are copied completely, as there would be
+ * no extent data (nbdcopy will still sparsify them on the target,
+ * but we'd have to copy all the bits from VMware). Because
+ * here we don't know if this is the case, be conservative and
+ * actually don't use this filter.
+ *
+ * If used, this filter should be close to the plugin and MUST
+ * be below the COW filter.
+ *
+ * XXX Add some kind of debugging flag so we can test how this
+ * works in production.
+ *)
+ (*Nbdkit.add_filter_if_available cmd "noextents";*)
+
(* Split very large requests to avoid out of memory errors on the
* server. Since we're using this filter, also add minblock=512
* although it will make no difference.