summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorValentin Rothberg <vrothberg@redhat.com>2022-04-26 13:31:10 +0200
committerValentin Rothberg <vrothberg@redhat.com>2022-04-26 14:25:17 +0200
commitfacc009ca070085bb1c32f146f77c2a0a62090b0 (patch)
tree6ebb7b822f1c8b9f12a6ec2440ed7af18e76afd7
parent913a3a813c168b47f982bb6851a0968858946f85 (diff)
downloadpodman-facc009ca070085bb1c32f146f77c2a0a62090b0.tar.gz
podman-facc009ca070085bb1c32f146f77c2a0a62090b0.tar.bz2
podman-facc009ca070085bb1c32f146f77c2a0a62090b0.zip
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 <vrothberg@redhat.com>
-rw-r--r--Makefile2
-rw-r--r--hack/podman-registry-go/registry.go24
-rw-r--r--test/e2e/benchmarks_test.go79
3 files changed, 87 insertions, 18 deletions
diff --git a/Makefile b/Makefile
index c14e58f66..5aab30d89 100644
--- a/Makefile
+++ b/Makefile
@@ -134,7 +134,7 @@ ifeq ($(GOBIN),)
GOBIN := $(FIRST_GOPATH)/bin
endif
-export PATH := $(PATH):$(GOBIN)
+export PATH := $(PATH):$(GOBIN):$(CURDIR)/hack
GOMD2MAN ?= $(shell command -v go-md2man || echo '$(GOBIN)/go-md2man')
diff --git a/hack/podman-registry-go/registry.go b/hack/podman-registry-go/registry.go
index 143a83fa1..095f6fb18 100644
--- a/hack/podman-registry-go/registry.go
+++ b/hack/podman-registry-go/registry.go
@@ -9,10 +9,10 @@ import (
)
const (
- imageKey = "PODMAN_REGISTRY_IMAGE"
- userKey = "PODMAN_REGISTRY_USER"
- passKey = "PODMAN_REGISTRY_PASS"
- portKey = "PODMAN_REGISTRY_PORT"
+ ImageKey = "PODMAN_REGISTRY_IMAGE"
+ UserKey = "PODMAN_REGISTRY_USER"
+ PassKey = "PODMAN_REGISTRY_PASS"
+ PortKey = "PODMAN_REGISTRY_PORT"
)
var binary = "podman-registry"
@@ -52,13 +52,13 @@ func Start() (*Registry, error) {
key := spl[0]
val := strings.TrimSuffix(strings.TrimPrefix(spl[1], "\""), "\"")
switch key {
- case imageKey:
+ case ImageKey:
registry.Image = val
- case userKey:
+ case UserKey:
registry.User = val
- case passKey:
+ case PassKey:
registry.Password = val
- case portKey:
+ case PortKey:
registry.Port = val
default:
logrus.Errorf("Unexpected podman-registry output: %q", s)
@@ -67,16 +67,16 @@ func Start() (*Registry, error) {
// Extra sanity check.
if registry.Image == "" {
- return nil, errors.Errorf("unexpected output %q: %q missing", out, imageKey)
+ return nil, errors.Errorf("unexpected output %q: %q missing", out, ImageKey)
}
if registry.User == "" {
- return nil, errors.Errorf("unexpected output %q: %q missing", out, userKey)
+ return nil, errors.Errorf("unexpected output %q: %q missing", out, UserKey)
}
if registry.Password == "" {
- return nil, errors.Errorf("unexpected output %q: %q missing", out, passKey)
+ return nil, errors.Errorf("unexpected output %q: %q missing", out, PassKey)
}
if registry.Port == "" {
- return nil, errors.Errorf("unexpected output %q: %q missing", out, portKey)
+ return nil, errors.Errorf("unexpected output %q: %q missing", out, PortKey)
}
registry.running = true
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
// --------------------------------------------------------------------------