From ad72a2cf2f906a8c5d44035e41574c42fd0a4916 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 08:16:57 +0000 Subject: [PATCH 01/10] refactor: rename topology rendering benchmarks --- app/benchmark_internal_test.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 8f6b7ba4c..8f90afd4b 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -76,7 +76,7 @@ func BenchmarkReportUpgrade(b *testing.B) { } } -func BenchmarkTopologyList(b *testing.B) { +func BenchmarkRenderList(b *testing.B) { benchmarkRender(b, func(report report.Report) { request := &http.Request{ Form: url.Values{}, @@ -105,27 +105,27 @@ func benchmarkRender(b *testing.B, f func(report.Report)) { } } -func BenchmarkTopologyHosts(b *testing.B) { - benchmarkOneTopology(b, "hosts") +func BenchmarkRenderHosts(b *testing.B) { + benchmarkRenderTopology(b, "hosts") } -func BenchmarkTopologyControllers(b *testing.B) { - benchmarkOneTopology(b, "kube-controllers") +func BenchmarkRenderControllers(b *testing.B) { + benchmarkRenderTopology(b, "kube-controllers") } -func BenchmarkTopologyPods(b *testing.B) { - benchmarkOneTopology(b, "pods") +func BenchmarkRenderPods(b *testing.B) { + benchmarkRenderTopology(b, "pods") } -func BenchmarkTopologyContainers(b *testing.B) { - benchmarkOneTopology(b, "containers") +func BenchmarkRenderContainers(b *testing.B) { + benchmarkRenderTopology(b, "containers") } -func BenchmarkTopologyProcesses(b *testing.B) { - benchmarkOneTopology(b, "processes") +func BenchmarkRenderProcesses(b *testing.B) { + benchmarkRenderTopology(b, "processes") } -func benchmarkOneTopology(b *testing.B, topologyID string) { +func benchmarkRenderTopology(b *testing.B, topologyID string) { benchmarkRender(b, func(report report.Report) { renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) if err != nil { From 43fadceb85e06f9584b55244b6eb73ae6ff083c6 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 08:18:12 +0000 Subject: [PATCH 02/10] cosmetic: better function grouping --- app/benchmark_internal_test.go | 38 +++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 8f90afd4b..26d420e90 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -76,15 +76,6 @@ func BenchmarkReportUpgrade(b *testing.B) { } } -func BenchmarkRenderList(b *testing.B) { - benchmarkRender(b, func(report report.Report) { - request := &http.Request{ - Form: url.Values{}, - } - topologyRegistry.renderTopologies(report, request) - }) -} - func benchmarkRender(b *testing.B, f func(report.Report)) { r := fixture.Report if *benchReportPath != "" { @@ -105,6 +96,25 @@ func benchmarkRender(b *testing.B, f func(report.Report)) { } } +func benchmarkRenderTopology(b *testing.B, topologyID string) { + benchmarkRender(b, func(report report.Report) { + renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) + if err != nil { + b.Fatal(err) + } + render.Render(report, renderer, filter) + }) +} + +func BenchmarkRenderList(b *testing.B) { + benchmarkRender(b, func(report report.Report) { + request := &http.Request{ + Form: url.Values{}, + } + topologyRegistry.renderTopologies(report, request) + }) +} + func BenchmarkRenderHosts(b *testing.B) { benchmarkRenderTopology(b, "hosts") } @@ -124,13 +134,3 @@ func BenchmarkRenderContainers(b *testing.B) { func BenchmarkRenderProcesses(b *testing.B) { benchmarkRenderTopology(b, "processes") } - -func benchmarkRenderTopology(b *testing.B, topologyID string) { - benchmarkRender(b, func(report report.Report) { - renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) - if err != nil { - b.Fatal(err) - } - render.Render(report, renderer, filter) - }) -} From 49e4c7b0b65b2485bb25e45f5ecaa7772b6135b8 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 08:29:37 +0000 Subject: [PATCH 03/10] make report upgrade benchmark reflect new phasing Since #2979 upgrading happens prior to merging. --- app/benchmark_internal_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 26d420e90..6fd2117b1 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -67,12 +67,13 @@ func BenchmarkReportUpgrade(b *testing.B) { if err != nil { b.Fatal(err) } - r := NewSmartMerger().Merge(reports) b.ResetTimer() for i := 0; i < b.N; i++ { - r.Upgrade() + for _, r := range reports { + r.Upgrade() + } } } From 794c345aeef40cbe99d0d771e4a547cf847dfdb0 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 08:33:13 +0000 Subject: [PATCH 04/10] cosmetic: more logical function order --- app/benchmark_internal_test.go | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 6fd2117b1..2ddbe8855 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -48,20 +48,6 @@ func BenchmarkReportUnmarshal(b *testing.B) { } } -func BenchmarkReportMerge(b *testing.B) { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) - } - merger := NewSmartMerger() - - b.ResetTimer() - - for i := 0; i < b.N; i++ { - merger.Merge(reports) - } -} - func BenchmarkReportUpgrade(b *testing.B) { reports, err := readReportFiles(*benchReportPath) if err != nil { @@ -77,6 +63,20 @@ func BenchmarkReportUpgrade(b *testing.B) { } } +func BenchmarkReportMerge(b *testing.B) { + reports, err := readReportFiles(*benchReportPath) + if err != nil { + b.Fatal(err) + } + merger := NewSmartMerger() + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + merger.Merge(reports) + } +} + func benchmarkRender(b *testing.B, f func(report.Report)) { r := fixture.Report if *benchReportPath != "" { From 615cb6af5934acd9f0ac77ecdf08e73c52b6b971 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 08:43:24 +0000 Subject: [PATCH 05/10] simplify error handling --- app/benchmark_internal_test.go | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 2ddbe8855..abfb3a915 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -17,7 +17,7 @@ var ( benchReportPath = flag.String("bench-report-path", "", "report file, or dir with files, to use for benchmarking (relative to this package)") ) -func readReportFiles(path string) ([]report.Report, error) { +func readReportFiles(b *testing.B, path string) []report.Report { reports := []report.Report{} if err := filepath.Walk(path, func(p string, info os.FileInfo, err error) error { @@ -34,28 +34,21 @@ func readReportFiles(path string) ([]report.Report, error) { reports = append(reports, rpt) return nil }); err != nil { - return nil, err + b.Fatal(err) } - return reports, nil + return reports } func BenchmarkReportUnmarshal(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { - if _, err := readReportFiles(*benchReportPath); err != nil { - b.Fatal(err) - } + readReportFiles(b, *benchReportPath) } } func BenchmarkReportUpgrade(b *testing.B) { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) - } - + reports := readReportFiles(b, *benchReportPath) b.ResetTimer() - for i := 0; i < b.N; i++ { for _, r := range reports { r.Upgrade() @@ -64,14 +57,9 @@ func BenchmarkReportUpgrade(b *testing.B) { } func BenchmarkReportMerge(b *testing.B) { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) - } + reports := readReportFiles(b, *benchReportPath) merger := NewSmartMerger() - b.ResetTimer() - for i := 0; i < b.N; i++ { merger.Merge(reports) } @@ -80,11 +68,7 @@ func BenchmarkReportMerge(b *testing.B) { func benchmarkRender(b *testing.B, f func(report.Report)) { r := fixture.Report if *benchReportPath != "" { - reports, err := readReportFiles(*benchReportPath) - if err != nil { - b.Fatal(err) - } - r = NewSmartMerger().Merge(reports) + r = NewSmartMerger().Merge(readReportFiles(b, *benchReportPath)) } b.ResetTimer() From bf14b3dafd5d23b774f8b161146fbd73e75f5119 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 08:50:08 +0000 Subject: [PATCH 06/10] upgrade reports we merge / render This better reflects what the app is doing. --- app/benchmark_internal_test.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index abfb3a915..337610c49 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -46,18 +46,24 @@ func BenchmarkReportUnmarshal(b *testing.B) { } } +func upgradeReports(reports []report.Report) []report.Report { + upgraded := make([]report.Report, len(reports)) + for i, r := range reports { + upgraded[i] = r.Upgrade() + } + return upgraded +} + func BenchmarkReportUpgrade(b *testing.B) { reports := readReportFiles(b, *benchReportPath) b.ResetTimer() for i := 0; i < b.N; i++ { - for _, r := range reports { - r.Upgrade() - } + upgradeReports(reports) } } func BenchmarkReportMerge(b *testing.B) { - reports := readReportFiles(b, *benchReportPath) + reports := upgradeReports(readReportFiles(b, *benchReportPath)) merger := NewSmartMerger() b.ResetTimer() for i := 0; i < b.N; i++ { @@ -68,7 +74,7 @@ func BenchmarkReportMerge(b *testing.B) { func benchmarkRender(b *testing.B, f func(report.Report)) { r := fixture.Report if *benchReportPath != "" { - r = NewSmartMerger().Merge(readReportFiles(b, *benchReportPath)) + r = NewSmartMerger().Merge(upgradeReports(readReportFiles(b, *benchReportPath))) } b.ResetTimer() From d4d7764311cc15d350bd4f64adeb04bcfe551270 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 09:06:56 +0000 Subject: [PATCH 07/10] cosmetic(ish) --- app/benchmark_internal_test.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 337610c49..e61a8c3f7 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -76,9 +76,7 @@ func benchmarkRender(b *testing.B, f func(report.Report)) { if *benchReportPath != "" { r = NewSmartMerger().Merge(upgradeReports(readReportFiles(b, *benchReportPath))) } - b.ResetTimer() - for i := 0; i < b.N; i++ { b.StopTimer() render.ResetCache() @@ -99,10 +97,7 @@ func benchmarkRenderTopology(b *testing.B, topologyID string) { func BenchmarkRenderList(b *testing.B) { benchmarkRender(b, func(report report.Report) { - request := &http.Request{ - Form: url.Values{}, - } - topologyRegistry.renderTopologies(report, request) + topologyRegistry.renderTopologies(report, &http.Request{Form: url.Values{}}) }) } From 6784d95ac870478278684db4f5fa79237a4db23c Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 09:18:20 +0000 Subject: [PATCH 08/10] refactor: extract getting report for benchmarking --- app/benchmark_internal_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index e61a8c3f7..4a705297c 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -71,11 +71,16 @@ func BenchmarkReportMerge(b *testing.B) { } } -func benchmarkRender(b *testing.B, f func(report.Report)) { +func getReport(b *testing.B) report.Report { r := fixture.Report if *benchReportPath != "" { r = NewSmartMerger().Merge(upgradeReports(readReportFiles(b, *benchReportPath))) } + return r +} + +func benchmarkRender(b *testing.B, f func(report.Report)) { + r := getReport(b) b.ResetTimer() for i := 0; i < b.N; i++ { b.StopTimer() From 06e0bed015f0698a31359a3c1f209923bd567b98 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 09:44:48 +0000 Subject: [PATCH 09/10] refactor: extract helper for rendering a topology --- app/benchmark_internal_test.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 4a705297c..e2aa36022 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -90,13 +90,17 @@ func benchmarkRender(b *testing.B, f func(report.Report)) { } } +func renderForTopology(b *testing.B, topologyID string, report report.Report) report.Nodes { + renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) + if err != nil { + b.Fatal(err) + } + return render.Render(report, renderer, filter).Nodes +} + func benchmarkRenderTopology(b *testing.B, topologyID string) { benchmarkRender(b, func(report report.Report) { - renderer, filter, err := topologyRegistry.RendererForTopology(topologyID, url.Values{}, report) - if err != nil { - b.Fatal(err) - } - render.Render(report, renderer, filter) + renderForTopology(b, topologyID, report) }) } From f4668ca692770400b7ad57d4755739d80c1c6a67 Mon Sep 17 00:00:00 2001 From: Matthias Radestock Date: Sun, 24 Dec 2017 09:48:41 +0000 Subject: [PATCH 10/10] add benchmarks for report summarization This is the last phase before result marshalling in the /api/topology/{name} handler. --- app/benchmark_internal_test.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index e2aa36022..b689e6765 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -9,6 +9,7 @@ import ( "testing" "github.com/weaveworks/scope/render" + "github.com/weaveworks/scope/render/detailed" "github.com/weaveworks/scope/report" "github.com/weaveworks/scope/test/fixture" ) @@ -129,3 +130,33 @@ func BenchmarkRenderContainers(b *testing.B) { func BenchmarkRenderProcesses(b *testing.B) { benchmarkRenderTopology(b, "processes") } + +func benchmarkSummarizeTopology(b *testing.B, topologyID string) { + r := getReport(b) + rc := report.RenderContext{Report: r} + nodes := renderForTopology(b, topologyID, r) + b.ResetTimer() + for i := 0; i < b.N; i++ { + detailed.Summaries(rc, nodes) + } +} + +func BenchmarkSummarizeHosts(b *testing.B) { + benchmarkSummarizeTopology(b, "hosts") +} + +func BenchmarkSummarizeControllers(b *testing.B) { + benchmarkSummarizeTopology(b, "kube-controllers") +} + +func BenchmarkSummarizePods(b *testing.B) { + benchmarkSummarizeTopology(b, "pods") +} + +func BenchmarkSummarizeContainers(b *testing.B) { + benchmarkSummarizeTopology(b, "containers") +} + +func BenchmarkSummarizeProcesses(b *testing.B) { + benchmarkSummarizeTopology(b, "processes") +}