[Bug 296466] copy_file_range can be very slow on zfs even for small files

[email protected]
Newsgroups gmane.os.freebsd.bugs
Message-ID <[email protected]/bugzilla/>
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=296466

            Bug ID: 296466
           Summary: copy_file_range can be very slow on zfs even for small
                    files
           Product: Base System
           Version: 14.4-RELEASE
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: kern
          Assignee: [email protected]
          Reporter: [email protected]

The following shows /usr/bin/install running very slowly when copying the same
small file 10 times:

$ df /tmp
Filesystem          1K-blocks Used      Avail Capacity  Mounted on
syspool/system/tmp 1579986920 2916 1579984004     0%    /tmp
$ zpool status syspool
  pool: syspool
 state: ONLINE
  scan: scrub repaired 0B in 00:22:36 with 0 errors on Mon Jun 22 12:24:49 2026
config:

        NAME               STATE     READ WRITE CKSUM
        syspool            ONLINE       0     0     0
          mirror-0         ONLINE       0     0     0
            gpt/zsysdisk0  ONLINE       0     0     0
            gpt/zsysdisk1  ONLINE       0     0     0

errors: No known data errors
$ seq 1 10000 | tee /tmp/hh | wc -c
   48894
$ /usr/bin/time csh -c 'repeat 10 /usr/bin/install /tmp/hh /tmp/hh2'
        1.52 real         0.00 user         0.04 sys
$ /usr/bin/time csh -c 'repeat 10 /usr/bin/install /tmp/hh /tmp/hh2'
        1.63 real         0.01 user         0.02 sys
$ truss -fc csh -c 'repeat 10 /usr/bin/install /tmp/hh /tmp/hh2'
syscall                     seconds   calls  errors
sigreturn               0.000210349      10      10
fchmod                  0.000451316      10       0
rename                  0.002175952      10       0
copy_file_range         1.406585436      20       0
getrandom               0.000238228      10       0
minherit                0.000193221      10       0
execve                  0.003492236      10      10
sigsuspend              1.471121187      10      10
umask                   0.000017425       1       0
lseek                   0.000472312      26       0
getpgrp                 0.000018428       1       0
wait4                   0.000570728      21      10
write                   0.000028104       1       0
recvfrom                0.000035205       2       0
poll                    0.000278623       2       0
sendto                  0.000062127       2       0
connect                 0.000048705       2       0
socket                  0.000046869       2       0
getpid                  0.000239035      13       0
getpeername             0.000016303       1       1
setitimer               0.000617037      32       0
fork                    0.002382183      11       0
dup                     0.001035424      56       0
pipe2                   0.000026176       1       0
__getcwd                0.000020123       1       0
sigprocmask             0.001605172      87       0
sigaction               0.000847859      45       0
ioctl                   0.000699790      35       6
dup2                    0.000074504       4       0
getegid                 0.000018361       1       0
geteuid                 0.000036304       2       0
getgid                  0.000019093       1       0
getuid                  0.000017192       1       0
openat                  0.001696058      35       1
getrusage               0.000443794      22       0
__sysctl                0.000128361       6       0
getdirentries           0.001201559      27       0
fcntl                   0.000956225      52       0
fstatat                 0.001112990      50       5
cpuset_getaffinity      0.000222640      11       0
readlink                0.000239186      11      11
sysarch                 0.000200259      11       0
munmap                  0.000825598      34       0
pread                   0.000444490      13       0
close                   0.004672428     202      33
read                    0.004842528      40       0
fstat                   0.002653986     133      56
open                    0.002064127      87      16
sigfastblock            0.000192375      11       0
issetugid               0.000485598      28       0
mprotect                0.001482952      70       0
mmap                    0.005792957     229       0
                      ------------- ------- -------
                        2.923359118    1513     169
$ 

One interesting thing to note is that files containing random data are fast:

$ dd if=/dev/random of=/tmp/hh bs=1 count=48894
48894+0 records in
48894+0 records out
48894 bytes transferred in 0.614548 secs (79561 bytes/sec)
$ /usr/bin/time csh -c 'repeat 10 /usr/bin/install /tmp/hh /tmp/hh2'
        0.03 real         0.00 user         0.03 sys
$ /usr/bin/time csh -c 'repeat 10 /usr/bin/install /tmp/hh /tmp/hh2'
        0.03 real         0.03 user         0.02 sys
$ 

I don't remember seeing this problem in FreeBSD 13.  I suspect it is somehow
related to the fact that zfs in FreeBSD 14 defaults to compression=on, which
even affects all old datasets that didn't set it off specifically.

I first noticed this when running freebsd-update install, which took over 10
minutes to update 8850 files from 14.4-RELEASE-p5 to 14.4-RELEASE-p6.

-- 
You are receiving this mail because:
You are the assignee for the bug.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.