Re: git: c98a764c681f - main - cp(1): fix performance issue for large non-sparse file copies
Date: Mon, 10 Apr 2023 07:54:49 UTC
On Sun, Jan 03, 2021 at 01:02:18AM +0000, Rick Macklem wrote:
> commit c98a764c681f8b70812a9f13a6e61c96aa1a69d2
>
> cp(1): fix performance issue for large non-sparse file copies
>
> PR252358 reported a serious performance problem when
> copying a large non-sparse file on a UFS file system.
> This problem seems to have been caused by a large
> number of SEEK_HOLE operations, with one done
> for each copy_file_range(2) call.
>
> This patch modifies cp(1) to use a large (SSIZE_MAX)
> len argument, reducing the number of system calls
> and resolving the performance issue.
> char *p;
>
> @@ -236,7 +235,7 @@ copy_file(const FTSENT *entp, int dne)
> do {
> if (use_copy_file_range) {
> rcount = copy_file_range(from_fd, NULL,
> - to_fd, NULL, bufsize, 0);
> + to_fd, NULL, SSIZE_MAX, 0);
Hi Rick,
This change unfortunately breaks copying files in resource-limited
environments (e.g. many port builders do that to prevent runaway
processes):
ulimit -f 16384000
cp -p packages/13.0-i386-wip/All/perl5-5.32.1_3.tbz /tmp ; echo $?
Filesize limit exceeded
153
Previously bufsize was 2097152 which was a lot saner than current
9223372036854775807. Perhaps we should set it per getrlimit(2)
value for RLIMIT_FSIZE?
./danfe