From 87bb8d73a2fcb642fd4b4b78f09605de52aaf9c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20R=C3=BChsen?= Date: Wed, 14 Aug 2024 19:18:48 +0200 Subject: [PATCH] Tool for benchmarking compression of wire messages --- tools/protobench/README.md | 31 ++++++ tools/protobench/cli_flags.go | 78 +++++++++++++++ tools/protobench/compressor.go | 139 ++++++++++++++++++++++++++ tools/protobench/example.png | Bin 0 -> 46549 bytes tools/protobench/go.mod | 24 +++++ tools/protobench/go.sum | 90 +++++++++++++++++ tools/protobench/main.go | 172 +++++++++++++++++++++++++++++++++ tools/protobench/summary.go | 117 ++++++++++++++++++++++ 8 files changed, 651 insertions(+) create mode 100644 tools/protobench/README.md create mode 100644 tools/protobench/cli_flags.go create mode 100644 tools/protobench/compressor.go create mode 100644 tools/protobench/example.png create mode 100644 tools/protobench/go.mod create mode 100644 tools/protobench/go.sum create mode 100644 tools/protobench/main.go create mode 100644 tools/protobench/summary.go diff --git a/tools/protobench/README.md b/tools/protobench/README.md new file mode 100644 index 00000000..7f27784d --- /dev/null +++ b/tools/protobench/README.md @@ -0,0 +1,31 @@ +The idea is to record the wire messages of the profiling agent and see how well they compress using different +compressors and what the CPU impact is. + +To record the wire messages, you need to run the profiling agent with the `-bench-proto-dir` flag. +This will write the wire messages into the given directory. The directory will be created if it does not exist. + +You can then use the `protobench` tool to compress the wire messages and see how well they compress and how much +CPU time it takes to compress them. + +To run the profiling agent, first have a receiving endpoint, e.g. `devfiler` listening on localhost:11000. +Then run the profiling agent with the `-bench-proto-dir` flag: +```shell +sudo ./opentelemetry-ebpf-profiler -bench-proto-dir=/tmp/protobuf -collection-agent=127.0.0.1:11000 -disable-tls +``` +The wire messages are written to `protobuf/`, one file per message. + +To compress the wire messages and generate a bar chart, run the `protobench` tool: +```shell +cd tools/protobench +go run ./... -bench-proto-dir=/tmp/protobuf -output-file=results.png +``` +If you don't see any errors, the tool will generate a PNG file with a bar chart showing the compression ratio and +compression time for each compressor. +The extension `.csv` can be used to generate a CSV file with the raw data instead of a PNG file. +No `-output-file` flag will display the results in the terminal. + +Of course, you can also use the `protobench` tool to compare compression of any other files. + +### Example PNG output + +![Example output](example.png) diff --git a/tools/protobench/cli_flags.go b/tools/protobench/cli_flags.go new file mode 100644 index 00000000..a43d3423 --- /dev/null +++ b/tools/protobench/cli_flags.go @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Apache License 2.0. + * See the file "LICENSE" for details. + */ + +package main + +import ( + "errors" + "flag" + "os" + "path/filepath" + + "github.com/peterbourgon/ff/v3" +) + +const ( + defaultArgBenchProtoDir = "" + defaultArgOutputFile = "" +) + +// Help strings for command line arguments +var ( + benchProtoDirHelp = "Directory to store raw protobuf wire messages." + outputFileHelp = "Output file to store the benchmark results (*.csv or *.png)." +) + +type arguments struct { + benchProtoDir string + outputFile string + + fs *flag.FlagSet +} + +func (args *arguments) SanityCheck() error { + if args.benchProtoDir == "" { + return errors.New("no protobuf message directory specified") + } + + if args.outputFile != "" { + switch filepath.Ext(args.outputFile) { + case ".csv", ".png": + default: + return errors.New("output file must be either a .csv or .png file") + } + } + + return nil +} + +// Package-scope variable, so that conditionally compiled other components can refer +// to the same flagset. + +func parseArgs() (*arguments, error) { + var args arguments + + fs := flag.NewFlagSet("protobench", flag.ExitOnError) + + fs.StringVar(&args.benchProtoDir, "bench-proto-dir", defaultArgBenchProtoDir, + benchProtoDirHelp) + + fs.StringVar(&args.outputFile, "output-file", defaultArgOutputFile, + outputFileHelp) + + fs.Usage = func() { + fs.PrintDefaults() + } + + args.fs = fs + + return &args, ff.Parse(fs, os.Args[1:], + ff.WithEnvVarPrefix("OTEL_PROTOBENCH"), + ff.WithConfigFileFlag("config"), + ff.WithConfigFileParser(ff.PlainParser), + ff.WithAllowMissingConfigFile(true), + ) +} diff --git a/tools/protobench/compressor.go b/tools/protobench/compressor.go new file mode 100644 index 00000000..c1c6a376 --- /dev/null +++ b/tools/protobench/compressor.go @@ -0,0 +1,139 @@ +package main + +import ( + "bytes" + + "github.com/andybalholm/brotli" + "github.com/klauspost/compress/gzip" + "github.com/klauspost/compress/s2" + "github.com/klauspost/compress/zstd" + "github.com/pierrec/lz4/v4" +) + +type compressor interface { + // compress compresses the content and writes it to the pre-allocated buffer. + compress([]byte, *bytes.Buffer) (int64, error) + id() string +} + +type noneCompressor struct { + name string +} + +func (n noneCompressor) id() string { return n.name } +func (noneCompressor) compress(content []byte, _ *bytes.Buffer) (int64, error) { + return int64(len(content)), nil +} + +type gzipCompressor struct { + name string + level int +} + +func (g gzipCompressor) id() string { return g.name } +func (g gzipCompressor) compress(content []byte, buf *bytes.Buffer) (int64, error) { + encoder, err := gzip.NewWriterLevel(buf, g.level) + if err != nil { + return 0, err + } + defer encoder.Close() + + if _, err = encoder.Write(content); err != nil { + return 0, err + } + if err := encoder.Close(); err != nil { + return 0, err + } + + encoder.Flush() + + return int64(buf.Len()), nil +} + +type zstdCompressor struct { + name string + level zstd.EncoderLevel +} + +func (z zstdCompressor) id() string { return z.name } + +func (z zstdCompressor) compress(content []byte, buf *bytes.Buffer) (int64, error) { + encoder, err := zstd.NewWriter(buf, zstd.WithEncoderLevel(z.level)) + if err != nil { + return 0, err + } + defer encoder.Close() + + if _, err = encoder.Write(content); err != nil { + return 0, err + } + + encoder.Flush() + + return int64(buf.Len()), nil +} + +type brotliCompressor struct { + name string + level int +} + +func (b brotliCompressor) id() string { return b.name } + +func (b brotliCompressor) compress(content []byte, buf *bytes.Buffer) (int64, error) { + encoder := brotli.NewWriterLevel(buf, b.level) + defer encoder.Close() + + if _, err := encoder.Write(content); err != nil { + return 0, err + } + + encoder.Flush() + + return int64(buf.Len()), nil +} + +type s2Compressor struct { + name string + level s2.WriterOption +} + +func (s s2Compressor) id() string { return s.name } + +func (s s2Compressor) compress(content []byte, buf *bytes.Buffer) (int64, error) { + encoder := s2.NewWriter(buf, s.level) + defer encoder.Close() + + if _, err := encoder.Write(content); err != nil { + return 0, err + } + + encoder.Flush() + + return int64(buf.Len()), nil +} + +type lz4Compressor struct { + name string + level lz4.CompressionLevel +} + +func (l lz4Compressor) id() string { return l.name } + +func (l lz4Compressor) compress(content []byte, buf *bytes.Buffer) (int64, error) { + encoder := lz4.NewWriter(buf) + defer encoder.Close() + + err := encoder.Apply(lz4.CompressionLevelOption(l.level)) + if err != nil { + return 0, err + } + + if _, err = encoder.Write(content); err != nil { + return 0, err + } + + encoder.Flush() + + return int64(buf.Len()), nil +} diff --git a/tools/protobench/example.png b/tools/protobench/example.png new file mode 100644 index 0000000000000000000000000000000000000000..408cd575b77ed8d73964ec9603ac2207b09f10db GIT binary patch literal 46549 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