-
Notifications
You must be signed in to change notification settings - Fork 17.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
os: increase the amount of data transfer for sendfile(2) to reduce sy…
…scalls For the moment, Go calls sendfile(2) to transfer at most 4MB at a time while sendfile(2) actually allows a larger amount of data on one call. To reduce system calls of sendfile(2) during data copying, we should specify the number of bytes to copy as large as possible. This optimization is especially advantageous for bulky file-to-file copies, it would lead to a performance boost, the magnitude of this performance increase may not be very exciting, but it can also cut down the CPU overhead by decreasing the number of system calls. This is also how we've done in sendfile_windows.go with TransmitFile. goos: linux goarch: amd64 pkg: os cpu: DO-Premium-AMD │ old │ new │ │ sec/op │ sec/op vs base │ SendFile-8 1.135 ± 4% 1.052 ± 3% -7.24% (p=0.000 n=10) │ old │ new │ │ B/s │ B/s vs base │ SendFile-8 902.5Mi ± 4% 973.0Mi ± 3% +7.81% (p=0.000 n=10) │ old │ new │ │ B/op │ B/op vs base │ SendFile-8 272.0 ± 0% 272.0 ± 0% ~ (p=1.000 n=10) ¹ ¹ all samples are equal │ old │ new │ │ allocs/op │ allocs/op vs base │ SendFile-8 20.00 ± 0% 20.00 ± 0% ~ (p=1.000 n=10) ¹ ¹ all samples are equal Change-Id: Ib4d4c6bc693e23db24697363b29226f0c9776bb0 Reviewed-on: https://go-review.googlesource.com/c/go/+/605235 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Jorropo <jorropo.pgm@gmail.com> Run-TryBot: Andy Pan <panjf2000@gmail.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Carlos Amedee <carlos@golang.org>
- Loading branch information
Showing
7 changed files
with
89 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
// Copyright 2024 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
//go:build linux || solaris | ||
|
||
package os_test | ||
|
||
import ( | ||
"io" | ||
. "os" | ||
"testing" | ||
) | ||
|
||
func BenchmarkSendFile(b *testing.B) { | ||
hook := hookSendFileTB(b) | ||
|
||
// 1 GiB file size for copy. | ||
const fileSize = 1 << 30 | ||
|
||
src, _ := createTempFile(b, "benchmark-sendfile-src", int64(fileSize)) | ||
dst, err := CreateTemp(b.TempDir(), "benchmark-sendfile-dst") | ||
if err != nil { | ||
b.Fatalf("failed to create temporary file of destination: %v", err) | ||
} | ||
b.Cleanup(func() { | ||
dst.Close() | ||
}) | ||
|
||
b.ReportAllocs() | ||
b.SetBytes(int64(fileSize)) | ||
b.ResetTimer() | ||
|
||
for i := 0; i <= b.N; i++ { | ||
sent, err := io.Copy(dst, src) | ||
|
||
if err != nil { | ||
b.Fatalf("failed to copy data: %v", err) | ||
} | ||
if !hook.called { | ||
b.Fatalf("should have called the sendfile(2)") | ||
} | ||
if sent != int64(fileSize) { | ||
b.Fatalf("sent %d bytes, want %d", sent, fileSize) | ||
} | ||
|
||
// Rewind the files for the next iteration. | ||
if _, err := src.Seek(0, io.SeekStart); err != nil { | ||
b.Fatalf("failed to rewind the source file: %v", err) | ||
} | ||
if _, err := dst.Seek(0, io.SeekStart); err != nil { | ||
b.Fatalf("failed to rewind the destination file: %v", err) | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters