[Bug 255523] vn_generic_copy_file_range copies holes to EOF slowly

bugzilla-noreply at freebsd.org bugzilla-noreply at freebsd.org
Sat May 1 04:23:30 UTC 2021


https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=255523

            Bug ID: 255523
           Summary: vn_generic_copy_file_range copies holes to EOF slowly
           Product: Base System
           Version: 13.0-RELEASE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: kern
          Assignee: bugs at FreeBSD.org
          Reporter: asomers at FreeBSD.org

vn_generic_copy_file_range can copy both data and holes.  However, it copies
holes much more slowly than theoretically possible.  In my experiments using
NFS 4.2 with FreeBSD 13.0-RELEASE servers and clients and ZFS local file
systems, I can only achieve about 300 MBps when copying a file from NFS to
local disk, when that file consists of a single giant hole.  In theory, the
maximum speed should be infinite, given a sufficiently "large" sparse file.

Steps to Reproduce
==================
1) Mount a ZFS-backed file system using nfsv4 with minorversion=2
2) On the server, create a giant sparse file with "truncate -s 1t sparsefile"
3) On the client, copy it to local storage with "cp sparsefile /tmp"

Analysis
========

dtrace shows that vn_rdwr gets called repeatedly with len=64k.  Basically, it
extends the file by 64kB at a time.  That's due to the "xfer = blksize"
assignment in vn_generic_copy_file_range.  vn_generic_copy_file_range proceeds
to loop xfer bytes at a time.  Instead, it should write the entire hole at
once.

Note that this only happens when the hole extends to EOF.  If instead there is
a small data region at EOF, then vn_generic_copy_file_range does indeed handle
the hole efficiently.

-- 
You are receiving this mail because:
You are the assignee for the bug.


More information about the freebsd-bugs mailing list