[Libguestfs] [PATCH v2v] input: Disable multi-conn in VDDK input mode

Laszlo Ersek lersek at redhat.com
Tue Dec 7 05:26:52 UTC 2021


On 12/06/21 23:05, Richard W.M. Jones wrote:
> The cow filter unconditionally enables multi-conn (because it is
> safe).  However this causes an unintended consequence with the VDDK
> plugin.  Multiple VDDK handles are opened (one per multi-conn
> connection), and for some reason, possibly internal locking, they
> conflict with each other.  This manifests itself as API calls taking
> between 2 and 7 times longer to serve (especially QueryAllocatedBlocks
> which seems to slow down most).
> 
> Avoid this by adding nbdkit-multi-conn-filter with
> multi-conn-mode=disable on top which disables multi-conn
> advertisement.
> 
> Virt-v2v -ic esx://... -it vddk -o null, before this change:
> 
> [   2.8] Opening the source
> [  11.4] Inspecting the source
> [  16.2] Checking for sufficient free disk space in the guest
> [  16.2] Converting Windows 10 Enterprise to run on KVM
> virt-v2v: This guest has virtio drivers installed.
> [  25.5] Mapping filesystem data to avoid copying unused and blank areas
> [  67.3] Closing the overlay
> [  68.0] Assigning disks to buses
> [  68.0] Checking if the guest needs BIOS or UEFI to boot
> [  68.0] Copying disk 1/1
> █ 100% [****************************************]
> [ 416.4] Creating output metadata
> [ 416.4] Finishing off
> 
> After this change:
> 
> [   2.8] Opening the source
> [  12.6] Inspecting the source
> [  18.7] Checking for sufficient free disk space in the guest
> [  18.7] Converting Windows 10 Enterprise to run on KVM
> virt-v2v: This guest has virtio drivers installed.
> [  36.1] Mapping filesystem data to avoid copying unused and blank areas
> [  77.0] Closing the overlay
> [  77.9] Assigning disks to buses
> [  77.9] Checking if the guest needs BIOS or UEFI to boot
> [  77.9] Copying disk 1/1
> █ 100% [****************************************]
> [ 332.3] Creating output metadata
> [ 332.3] Finishing off
> ---
>  input/nbdkit_vddk.ml | 22 +++++++++++++++++++++-
>  1 file changed, 21 insertions(+), 1 deletion(-)
> 
> diff --git a/input/nbdkit_vddk.ml b/input/nbdkit_vddk.ml
> index 79ec363bce..c2c3cceb93 100644
> --- a/input/nbdkit_vddk.ml
> +++ b/input/nbdkit_vddk.ml
> @@ -157,10 +157,30 @@ See also the virt-v2v-input-vmware(1) manual.") libNN
>    let cmd = Nbdkit.add_filter_if_available cmd "cacheextents" in
>  
>    (* IMPORTANT! Add the COW filter.  It must be furthest away
> -   * except for the rate filter.
> +   * except for the multi-conn and rate filters.
>     *)
>    let cmd = Nbdkit.add_filter cmd "cow" in
>  
> +  (* The cow filter unconditionally enables multi-conn (because it is
> +   * safe).  However this causes an unintended consequence with the VDDK
> +   * plugin.  Multiple VDDK handles are opened (one per multi-conn
> +   * connection), and for some reason, possibly internal locking, they
> +   * conflict with each other.  This manifests itself as API calls taking
> +   * between 2 and 7 times longer to serve (especially QueryAllocatedBlocks
> +   * which seems to slow down most).

I wonder if the lock contention is in the vddk library, or on the vmware
server side... QueryAllocatedBlocks seems to be a read-only operation even.

Acked-by: Laszlo Ersek <lersek at redhat.com>

(I know it's already upstream, but still.)

Laszlo

> +   *
> +   * Avoid this by adding nbdkit-multi-conn-filter with
> +   * multi-conn-mode=disable on top which disables multi-conn
> +   * advertisement.
> +   *)
> +  let cmd =
> +    if Nbdkit.probe_filter "multi-conn" then (
> +      let cmd = Nbdkit.add_filter cmd "multi-conn" in
> +      let cmd = Nbdkit.add_arg cmd "multi-conn-mode" "disable" in
> +      cmd
> +    )
> +    else cmd in
> +
>    (* If the filter supports it, enable cow-block-size (added in
>     * nbdkit 1.27.6).  This helps to reduce fragmentated small
>     * extent and read requests.
> 




More information about the Libguestfs mailing list