Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Given all of the effort being put into zero-copy read/write in the kernel, I would assume there are significant performance gains available.

I suspect that some, correctly aligned, ranges could be copied with CoW semantics, thereby skipping the read/write altogether.



On NFS you can avoid network traffic completely.


Is this theoretical or is there support for it already in the kernel and NFS daemons?

Reading the manpage for copy_file_range the notes section states:

       copy_file_range() gives filesystems an opportunity to  implement  "copy
       acceleration"  techniques,  such  as  the use of reflinks (i.e., two or
       more inodes that share pointers to the same copy-on-write disk  blocks)
       or server-side-copy (in the case of NFS).
But doesn't mention if these techniques are actually used. I guess there's some help in future proofing your code.

Edit: I tested this on my Ubuntu 20.04 machine and a 1GB file full of random data sitting in the file cache. Using copy_file_range I could make a local-local copy in 0.595 seconds on average. Using a primitive copy/write loop took 0.600 seconds. But these values are somewhat noisy and the difference is down in the error margin. It doesn't appear that my 5.4.0 kernel on ext4 is employing the reflinks optimization.


It's totally practical and already implemented by Linux on both the server and the client side.


Can't share details, I've seen the copy_file_range optimization represent roughly 25% increased throughput for a prior employer. It's more than theoretical.


ext4 has no reflink support. btrfs does by default, xfs under some configurations. server-side offload is supported by nfs and cifs but also needs server-side support.


Even if it wasn't smart you'd still get a huge benifit from not context switching to/from kernel/user space for a standard copy implementation. Far fewer syscalls. There's a real performance benifit to be had there.


ext4 does not support sharing blocks across multiple files, indeed. Try btrfs or perhaps xfs.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: