Skip to content

Commit

Permalink
Add metricsviz function to process data from an on-disk lg file.
Browse files Browse the repository at this point in the history
This is part of a series of changes to add metric charts in performance
benchmarks.

PiperOrigin-RevId: 629819176
  • Loading branch information
EtiennePerot authored and gvisor-bot committed May 9, 2024
1 parent f8b4dab commit 952e883
Show file tree
Hide file tree
Showing 22 changed files with 273 additions and 56 deletions.
6 changes: 6 additions & 0 deletions test/benchmarks/base/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/base",
"//test/benchmarks/harness",
"//test/metricsviz",
],
)

Expand All @@ -38,6 +39,7 @@ benchmark_test(
"//test/benchmarks/base",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -49,6 +51,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -60,6 +63,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -71,6 +75,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -82,6 +87,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
"@com_github_docker_docker//api/types:go_default_library",
],
)
2 changes: 2 additions & 0 deletions test/benchmarks/base/hackbench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

// BenchmarHackbench runs hackbench on the runtime.
Expand Down Expand Up @@ -69,6 +70,7 @@ func BenchmarkHackbench(b *testing.B) {
); err != nil {
b.Fatalf("run failed with: %v", err)
}
defer metricsviz.FromContainerLogs(ctx, b, container)

cmd := tc.MakeCmd(b)
b.ResetTimer()
Expand Down
10 changes: 10 additions & 0 deletions test/benchmarks/base/size_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"gvisor.dev/gvisor/test/benchmarks/base"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

// BenchmarkSizeEmpty creates N empty containers and reads memory usage from
Expand Down Expand Up @@ -58,6 +59,9 @@ func BenchmarkSizeEmpty(b *testing.B) {
base.CleanUpContainers(ctx, containers)
b.Fatalf("failed to run container: %v", err)
}
if i == 0 {
defer metricsviz.FromContainerLogs(ctx, b, container)
}
if _, err := container.WaitForOutputSubmatch(ctx, "Hello", 5*time.Second); err != nil {
base.CleanUpContainers(ctx, containers)
b.Fatalf("failed to read container output: %v", err)
Expand Down Expand Up @@ -110,6 +114,9 @@ func BenchmarkSizeNginx(b *testing.B) {
Cmd: []string{"nginx", "-c", "/etc/nginx/nginx_gofer.conf"},
})
defer base.CleanUpContainers(ctx, servers)
if len(servers) > 0 {
defer metricsviz.FromContainerLogs(ctx, b, servers[0])
}

// DropCaches after servers are created.
harness.DropCaches(machine)
Expand Down Expand Up @@ -162,6 +169,9 @@ func BenchmarkSizeNode(b *testing.B) {
Cmd: nodeCmd,
})
defer base.CleanUpContainers(ctx, servers)
if len(servers) > 0 {
defer metricsviz.FromContainerLogs(ctx, b, servers[0])
}

// DropCaches after servers are created.
harness.DropCaches(machine)
Expand Down
5 changes: 5 additions & 0 deletions test/benchmarks/base/startup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/base"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/metricsviz"
)

// BenchmarkStartEmpty times startup time for an empty container.
Expand All @@ -46,6 +47,9 @@ func BenchmarkStartupEmpty(b *testing.B) {
b.Fatalf("failed to start container: %v", err)
}
b.StopTimer()
if i == 0 {
metricsviz.FromContainerLogs(ctx, b, container)
}
container.CleanUp(ctx)
harness.DebugLog(b, "Ran container: %d", i)
}
Expand Down Expand Up @@ -113,6 +117,7 @@ func runServerWorkload(ctx context.Context, b *testing.B, args base.ServerArgs)
server := args.Machine.GetContainer(ctx, b)
defer func() {
b.StopTimer()
metricsviz.FromContainerLogs(ctx, b, server)
// Cleanup servers as we run so that we can go indefinitely.
server.CleanUp(ctx)
b.StartTimer()
Expand Down
4 changes: 3 additions & 1 deletion test/benchmarks/base/sysbench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

type testCase struct {
Expand All @@ -30,7 +31,7 @@ type testCase struct {
test tools.Sysbench
}

// BenchmarSysbench runs sysbench on the runtime.
// BenchmarkSysbench runs sysbench on the runtime.
func BenchmarkSysbench(b *testing.B) {
testCases := []testCase{
{
Expand Down Expand Up @@ -108,6 +109,7 @@ func BenchmarkSysbench(b *testing.B) {
ctx := context.Background()
sysbench := machine.GetContainer(ctx, b)
defer sysbench.CleanUp(ctx)
defer metricsviz.FromContainerLogs(ctx, b, sysbench)

cmd := tc.test.MakeCmd(b)
b.ResetTimer()
Expand Down
3 changes: 3 additions & 0 deletions test/benchmarks/base/syscallbench_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

// BenchmarSyscallbench runs a syscall b.N times on the runtime.
Expand Down Expand Up @@ -67,6 +68,7 @@ func BenchmarkSyscallbench(b *testing.B) {
); err != nil {
b.Fatalf("run failed with: %v", err)
}
defer metricsviz.FromContainerLogs(ctx, b, container)
b.Run(name, func(b *testing.B) {
cmd := []string{"syscallbench", fmt.Sprintf("--loops=%d", b.N), fmt.Sprintf("--syscall=%d", tc.syscallArg)}
b.ResetTimer()
Expand Down Expand Up @@ -114,6 +116,7 @@ func BenchmarkSyscallUnderSeccomp(b *testing.B) {
); err != nil {
b.Fatalf("run failed with: %v", err)
}
defer metricsviz.FromContainerLogs(ctx, b, container)
b.Run(name, func(b *testing.B) {
cmd := []string{"syscallbench", "--syscall=1", fmt.Sprintf("--loops=%d", b.N)}
if tc.Value == "true" {
Expand Down
10 changes: 10 additions & 0 deletions test/benchmarks/base/usage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (
"gvisor.dev/gvisor/test/benchmarks/base"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

// BenchmarkSizeEmpty creates N alpine containers and reads memory usage using `docker stats`.
Expand All @@ -48,6 +49,9 @@ func BenchmarkSizeEmpty(b *testing.B) {
}, "sh", "-c", "echo Hello && sleep 1000"); err != nil {
b.Fatalf("failed to run container: %v", err)
}
if i == 0 {
defer metricsviz.FromContainerLogs(ctx, b, container)
}
if _, err := container.WaitForOutputSubmatch(ctx, "Hello", 5*time.Second); err != nil {
b.Fatalf("failed to read container output: %v", err)
}
Expand Down Expand Up @@ -92,6 +96,9 @@ func BenchmarkSizeNginx(b *testing.B) {
b.Fatalf("failed to start server: %v", err)
}
defer server.CleanUp(ctx)
if i == 0 {
defer metricsviz.FromContainerLogs(ctx, b, server)
}
stats, err := server.Stats(ctx)
if err != nil {
b.Fatalf("failed to get container stats: %v", err)
Expand Down Expand Up @@ -139,6 +146,9 @@ func BenchmarkSizeNode(b *testing.B) {
b.Fatalf("failed to start server: %v", err)
}
defer server.CleanUp(ctx)
if i == 0 {
defer metricsviz.FromContainerLogs(ctx, b, server)
}
stats, err := server.Stats(ctx)
if err != nil {
b.Fatalf("failed to get container stats: %v", err)
Expand Down
1 change: 1 addition & 0 deletions test/benchmarks/fs/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
"@com_github_docker_docker//api/types/mount:go_default_library",
],
)
Expand Down
2 changes: 2 additions & 0 deletions test/benchmarks/fs/fio_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

// Fio benchmarks run fio on the runtime under test. There are 4 basic test
Expand Down Expand Up @@ -192,6 +193,7 @@ func doFioBenchmark(b *testing.B, testCases []tools.Fio) {
ctx := context.Background()
container := machine.GetContainer(ctx, b)
cu := cleanup.Make(func() {
metricsviz.FromContainerLogs(ctx, b, container)
container.CleanUp(ctx)
})
defer cu.Clean()
Expand Down
1 change: 1 addition & 0 deletions test/benchmarks/media/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@ benchmark_test(
deps = [
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/metricsviz",
],
)
32 changes: 19 additions & 13 deletions test/benchmarks/media/ffmpeg_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (

"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/metricsviz"
)

// BenchmarkFfmpeg runs ffmpeg in a container and records runtime.
Expand All @@ -39,19 +40,24 @@ func BenchmarkFfmpeg(b *testing.B) {
b.StopTimer()

for i := 0; i < b.N; i++ {
container := machine.GetContainer(ctx, b)
defer container.CleanUp(ctx)
if err := harness.DropCaches(machine); err != nil {
b.Skipf("failed to drop caches: %v. You probably need root.", err)
}

b.StartTimer()
if _, err := container.Run(ctx, dockerutil.RunOpts{
Image: "benchmarks/ffmpeg",
}, cmd...); err != nil {
b.Fatalf("failed to run container: %v", err)
}
b.StopTimer()
func() {
container := machine.GetContainer(ctx, b)
defer container.CleanUp(ctx)
if i == 0 {
defer metricsviz.FromContainerLogs(ctx, b, container)
}
if err := harness.DropCaches(machine); err != nil {
b.Skipf("failed to drop caches: %v. You probably need root.", err)
}

b.StartTimer()
if _, err := container.Run(ctx, dockerutil.RunOpts{
Image: "benchmarks/ffmpeg",
}, cmd...); err != nil {
b.Fatalf("failed to run container: %v", err)
}
b.StopTimer()
}()
}
}

Expand Down
1 change: 1 addition & 0 deletions test/benchmarks/ml/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -21,5 +21,6 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)
36 changes: 21 additions & 15 deletions test/benchmarks/ml/tensorflow_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import (
"gvisor.dev/gvisor/pkg/test/dockerutil"
"gvisor.dev/gvisor/test/benchmarks/harness"
"gvisor.dev/gvisor/test/benchmarks/tools"
"gvisor.dev/gvisor/test/metricsviz"
)

func BenchmarkTensorflowDashboard(b *testing.B) {
Expand Down Expand Up @@ -70,22 +71,27 @@ func doTensorflowTest(b *testing.B, workloads map[string]string) {
b.StopTimer()

for i := 0; i < b.N; i++ {
container := machine.GetContainer(ctx, b)
defer container.CleanUp(ctx)
if err := harness.DropCaches(machine); err != nil {
b.Skipf("failed to drop caches: %v. You probably need root.", err)
}
func() {
container := machine.GetContainer(ctx, b)
defer container.CleanUp(ctx)
if i == 0 {
defer metricsviz.FromContainerLogs(ctx, b, container)
}
if err := harness.DropCaches(machine); err != nil {
b.Skipf("failed to drop caches: %v. You probably need root.", err)
}

// Run tensorflow.
b.StartTimer()
if out, err := container.Run(ctx, dockerutil.RunOpts{
Image: "benchmarks/tensorflow",
Env: []string{"PYTHONPATH=$PYTHONPATH:/TensorFlow-Examples/examples"},
WorkDir: "/TensorFlow-Examples/examples",
}, "python", file); err != nil {
b.Errorf("failed to run container: %v logs: %s", err, out)
}
b.StopTimer()
// Run tensorflow.
b.StartTimer()
if out, err := container.Run(ctx, dockerutil.RunOpts{
Image: "benchmarks/tensorflow",
Env: []string{"PYTHONPATH=$PYTHONPATH:/TensorFlow-Examples/examples"},
WorkDir: "/TensorFlow-Examples/examples",
}, "python", file); err != nil {
b.Errorf("failed to run container: %v logs: %s", err, out)
}
b.StopTimer()
}()
}
})
}
Expand Down
4 changes: 4 additions & 0 deletions test/benchmarks/network/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ go_library(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -31,6 +32,7 @@ benchmark_test(
"//pkg/test/testutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -45,6 +47,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand All @@ -59,6 +62,7 @@ benchmark_test(
"//pkg/test/dockerutil",
"//test/benchmarks/harness",
"//test/benchmarks/tools",
"//test/metricsviz",
],
)

Expand Down

0 comments on commit 952e883

Please sign in to comment.