RFR: 8265175: (fs) Files.copy(Path, Path, CopyOption...) should use sendfile on Linux [v2]
Brian Burkhalter
bpb at openjdk.java.net
Wed Apr 14 23:28:38 UTC 2021
On Wed, 14 Apr 2021 16:14:10 GMT, Brian Burkhalter <bpb at openjdk.org> wrote:
>> Please consider this request to change the underlying native implementation of `java.nio.file.Files.copy(Path,Path,CopyOption...)` on Linux only to perform zero-copy via `sendfile(2)`. The `sendfile()` system call is already used in `java.nio.channels.FIleChannel.transferTo(long,long,WritableByteChannel)`. It is intentionally _not_ proposed to use `sendfile()` in the native macOS implementation as on macOS the function requires that the destination file descriptor is for a socket.
>>
>> This change showed some performance improvement as measured by JMH.
>>
>> **Before: user-space buffers (read() + write())**
>>
>> Benchmark (size) Mode Cnt Score Error Units
>> FilesCopy.copy 10240 thrpt 5 39167.400 ± 683.887 ops/s
>> FilesCopy.copy 51200 thrpt 5 20782.622 ± 558.031 ops/s
>> FilesCopy.copy 102400 thrpt 5 13260.709 ± 176.673 ops/s
>> FilesCopy.copy 512000 thrpt 5 3171.837 ± 175.803 ops/s
>> FilesCopy.copy 1048568 thrpt 5 1654.253 ± 39.419 ops/s
>> FilesCopy.copy 10485760 thrpt 5 145.328 ± 7.192 ops/s
>> FilesCopy.copy 104857600 thrpt 5 12.440 ± 2.275 ops/s
>> FilesCopy.copy 1073741824 thrpt 5 1.073 ± 0.081 ops/s
>>
>> **After: zero-copy (sendfile())**
>>
>> Benchmark (size) Mode Cnt Score Error Units
>> FilesCopy.copy 10240 thrpt 5 40571.516 ± 548.977 ops/s
>> FilesCopy.copy 51200 thrpt 5 23993.334 ± 506.817 ops/s
>> FilesCopy.copy 102400 thrpt 5 15927.485 ± 309.081 ops/s
>> FilesCopy.copy 512000 thrpt 5 4207.129 ± 95.454 ops/s
>> FilesCopy.copy 1048568 thrpt 5 2147.046 ± 33.446 ops/s
>> FilesCopy.copy 10485760 thrpt 5 148.798 ± 1.329 ops/s
>> FilesCopy.copy 104857600 thrpt 5 14.541 ± 0.675 ops/s
>> FilesCopy.copy 1073741824 thrpt 5 1.270 ± 0.029 ops/s
>
> Brian Burkhalter has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR. The pull request contains one new commit since the last revision:
>
> 8265175: (fs) Files.copy(Path,Path,CopyOption...) should use sendfile on Linux
>From the notes on the man page for `sendfile(2)`:
sendfile() will transfer at most 0x7ffff000 (2,147,479,552)
bytes, returning the number of bytes actually transferred. (This
is true on both 32-bit and 64-bit systems.)
I verified this behavior on Ubuntu. For files larger than 2147479552, it transfers chunks of size 2147479552 except possibly for the last chunk in which case the number of remaining bytes is returned. At EOF, zero is returned. Thus for such large files the cancel mechanism should work.
-------------
PR: https://git.openjdk.java.net/jdk/pull/3476
More information about the nio-dev
mailing list