From efa357ce3c1a8ef0ce94347fef533c87673a598a Mon Sep 17 00:00:00 2001 From: Andy Pan Date: Sat, 27 Aug 2022 01:55:05 +0800 Subject: [PATCH] net: add benchmark test for SendFile BenchmarkSendFile/1024-4 716760 1582 ns/op 647.31 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/2048-4 624632 2057 ns/op 995.55 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/4096-4 429459 2665 ns/op 1537.06 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/8192-4 275941 4996 ns/op 1639.56 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/16384-4 149577 8522 ns/op 1922.58 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/32768-4 75427 14791 ns/op 2215.47 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/65536-4 43912 28402 ns/op 2307.41 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/131072-4 23509 48657 ns/op 2693.82 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/262144-4 12512 91791 ns/op 2855.87 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/524288-4 5760 579891 ns/op 904.12 MB/s 0 B/op 0 allocs/op BenchmarkSendFile/1048576-4 3020 344129 ns/op 3047.05 MB/s 0 B/op 0 allocs/op Change-Id: Iaf75e19c9ae8d77b89b3eabb2e9142f59c124536 Reviewed-on: https://go-review.googlesource.com/c/go/+/425878 Reviewed-by: Ian Lance Taylor Run-TryBot: Andy Pan Auto-Submit: Ian Lance Taylor Run-TryBot: Ian Lance Taylor Reviewed-by: Michael Knyszek TryBot-Result: Gopher Robot --- src/net/sendfile_linux_test.go | 77 ++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/net/sendfile_linux_test.go diff --git a/src/net/sendfile_linux_test.go b/src/net/sendfile_linux_test.go new file mode 100644 index 0000000000..2ca4ec0e75 --- /dev/null +++ b/src/net/sendfile_linux_test.go @@ -0,0 +1,77 @@ +// Copyright 2022 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 +// +build linux + +package net + +import ( + "io" + "os" + "strconv" + "testing" +) + +func BenchmarkSendFile(b *testing.B) { + for i := 0; i <= 10; i++ { + size := 1 << (i + 10) + bench := sendFileBench{chunkSize: size} + b.Run(strconv.Itoa(size), bench.benchSendFile) + } +} + +type sendFileBench struct { + chunkSize int +} + +func (bench sendFileBench) benchSendFile(b *testing.B) { + fileSize := b.N * bench.chunkSize + f := createTempFile(b, fileSize) + fileName := f.Name() + defer os.Remove(fileName) + defer f.Close() + + client, server := spliceTestSocketPair(b, "tcp") + defer server.Close() + + cleanUp, err := startSpliceClient(client, "r", bench.chunkSize, fileSize) + if err != nil { + b.Fatal(err) + } + defer cleanUp() + + b.ReportAllocs() + b.SetBytes(int64(bench.chunkSize)) + b.ResetTimer() + + // Data go from file to socket via sendfile(2). + sent, err := io.Copy(server, f) + if err != nil { + b.Fatalf("failed to copy data with sendfile, error: %v", err) + } + if sent != int64(fileSize) { + b.Fatalf("bytes sent mismatch\n\texpect: %d\n\tgot: %d", fileSize, sent) + } +} + +func createTempFile(b *testing.B, size int) *os.File { + f, err := os.CreateTemp("", "linux-sendfile-test") + if err != nil { + b.Fatalf("failed to create tmp directory: %v", err) + } + + data := make([]byte, size) + if _, err := f.Write(data); err != nil { + b.Fatalf("failed to create and feed the file: %v", err) + } + if err := f.Sync(); err != nil { + b.Fatalf("failed to save the file: %v", err) + } + if _, err := f.Seek(0, io.SeekStart); err != nil { + b.Fatalf("failed to rewind the file: %v", err) + } + + return f +} -- 2.50.0