From facc009ca070085bb1c32f146f77c2a0a62090b0 Mon Sep 17 00:00:00 2001 From: Valentin Rothberg Date: Tue, 26 Apr 2022 13:31:10 +0200 Subject: benchmarks: add more image benchmarks Add more benchmarks for the most common and performance-critical image commands. Benchmarks for `podman build` should go into a separate section. Signed-off-by: Valentin Rothberg --- test/e2e/benchmarks_test.go | 79 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 74 insertions(+), 5 deletions(-) (limited to 'test') diff --git a/test/e2e/benchmarks_test.go b/test/e2e/benchmarks_test.go index c631b06ee..9653cee3b 100644 --- a/test/e2e/benchmarks_test.go +++ b/test/e2e/benchmarks_test.go @@ -11,10 +11,12 @@ import ( "strconv" "strings" + podmanRegistry "github.com/containers/podman/v4/hack/podman-registry-go" . "github.com/containers/podman/v4/test/utils" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" . "github.com/onsi/gomega/gexec" + "github.com/sirupsen/logrus" ) var ( @@ -30,21 +32,23 @@ type benchmark struct { name string // The function to execute. main func() - // Function is run before `main`. - init func() + // Allows for extending a benchmark. + options newBenchmarkOptions } // Allows for customizing the benchnmark in an easy to extend way. type newBenchmarkOptions struct { // Sets the benchmark's init function. init func() + // Run a local registry for this benchmark. + needsRegistry bool } // Queue a new benchmark. func newBenchmark(name string, main func(), options *newBenchmarkOptions) { bm := benchmark{name: name, main: main} if options != nil { - bm.init = options.init + bm.options = *options } allBenchmarks = append(allBenchmarks, bm) } @@ -109,8 +113,23 @@ var _ = Describe("Podman Benchmark Suite", func() { for i := range allBenchmarks { setup() bm := allBenchmarks[i] - if bm.init != nil { - bm.init() + + // Start a local registry if requested. + var registry *podmanRegistry.Registry + if bm.options.needsRegistry { + reg, err := podmanRegistry.Start() + if err != nil { + logrus.Errorf("Error starting registry: %v", err) + os.Exit(1) + } + registry = reg + os.Setenv(podmanRegistry.UserKey, reg.User) + os.Setenv(podmanRegistry.PassKey, reg.Password) + os.Setenv(podmanRegistry.PortKey, reg.Port) + } + + if bm.options.init != nil { + bm.options.init() } // Set the time dir only for the main() function. @@ -120,6 +139,18 @@ var _ = Describe("Podman Benchmark Suite", func() { mem := totalMemoryInKb() b.RecordValueWithPrecision("[MEM] "+bm.name, float64(mem), "KB", 1) + + // Stop the local registry. + if bm.options.needsRegistry { + os.Unsetenv(podmanRegistry.UserKey) + os.Unsetenv(podmanRegistry.PassKey) + os.Unsetenv(podmanRegistry.PortKey) + if err := registry.Stop(); err != nil { + logrus.Errorf("Error stopping registry: %v", err) + os.Exit(1) + } + } + cleanup() } }, numBenchmarkSamples) @@ -142,6 +173,44 @@ var _ = Describe("Podman Benchmark Suite", func() { Expect(session).Should(Exit(0)) }, nil) + newBenchmark("podman load [docker]", func() { + session := podmanTest.Podman([]string{"load", "-i", "./testdata/docker-two-images.tar.xz"}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + }, nil) + + newBenchmark("podman load [oci]", func() { + session := podmanTest.Podman([]string{"load", "-i", "./testdata/oci-registry-name.tar.gz"}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + }, nil) + + newBenchmark("podman save", func() { + session := podmanTest.Podman([]string{"save", ALPINE, "-o", path.Join(podmanTest.TempDir, "alpine.tar")}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + }, nil) + + newBenchmark("podman image inspect", func() { + session := podmanTest.Podman([]string{"inspect", ALPINE}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + }, nil) + + newBenchmark("podman login + logout", func() { + user := os.Getenv(podmanRegistry.UserKey) + pass := os.Getenv(podmanRegistry.PassKey) + port := os.Getenv(podmanRegistry.PortKey) + + session := podmanTest.Podman([]string{"login", "-u", user, "-p", pass, "--tls-verify=false", "localhost:" + port}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + + session = podmanTest.Podman([]string{"logout", "localhost:" + port}) + session.WaitWithDefaultTimeout() + Expect(session).Should(Exit(0)) + }, &newBenchmarkOptions{needsRegistry: true}) + // -------------------------------------------------------------------------- // CONTAINER BENCHMARKS // -------------------------------------------------------------------------- -- cgit v1.2.3-54-g00ecf