3 ms·
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 som
by webstrand 6y ago
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.
- bonzini 6y agoOn NFS you can avoid network traffic completely.
- jandrese 6y agoIs 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.
- bonzini 6y agoIt's totally practical and already implemented by Linux on both the server and the client side.
- gravypod 6y agoEven 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.
- dallbee 6y agoCan'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.
- bonzini 6y agoext4 does not support sharing blocks across multiple files, indeed. Try btrfs or perhaps xfs.
- the8472 6y agoext4 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.