mmcloughlin / goperf Goto Github PK
View Code? Open in Web Editor NEWContinuous Benchmarking for the Go compiler
Home Page: https://goperf.org
License: BSD 3-Clause "New" or "Revised" License
Continuous Benchmarking for the Go compiler
Home Page: https://goperf.org
License: BSD 3-Clause "New" or "Revised" License
With the current terraform-based deployment, it's annoying that the hash of the archive keeps on changing.
Use Stackdriver Monitoring to define some basic metrics, for example:
Library code that will run benchmarks on a given:
go test
flagsFor each module there will be a minimum go commit that it works for. Any earlier commits are bound to fail, so the work scheduler should be able to detect when this has happened and stop scheduling work before that point.
Change queries to use points
table instead of results
.
Related #38
Make a nice diagram ๐
Investigate charges for "Network Inter Zone Egress".
Suspect this is because the SQL database is in a different zone to the cloud functions.
Workers currently write results files to an artifacts directory which isn't cleaned up. This directory could grow indefinitely.
We should ensure that files are cleaned up after they are needed.
Are there any ideas in this paper we can apply?
https://www.ifi.uzh.ch/dam/jcr:ccf1399a-2d57-4ff9-a3b0-59d69616d5d3/msr18-author-version.pdf
Via anp/lolbench#67
Add support for testing the special-case std
module.
Use "Stackdriver Trace" for tracing.
Provide a way to view recent tasks in the dashboard UI.
Need a way to expose significant changes in the dashboard UI.
Related #25
Cloud function triggered on new commits added to firestore to enqueue benchmark jobs on pubsub topic.
For some reason a small number of tasks are stuck in the results_uploaded
state. At the moment these trigger the stale timeout and are re-processed. This is fine but it might be better to have a secondary process that ingests data files from these tasks.
Currently queried by date, meaning that we get a different number of commits each time. Also the graphs for different environments don't line up.
Make an index page. Highlight top changes.
Provide a view for comparing results from two commits.
Use benchstat
for the delta statistics: https://pkg.go.dev/github.com/golang/perf/benchstat
Google analytics for usage stats.
There are some clear false positives, or attribution to incorrect commits. Example:
https://goperf.org/bench/778e1e4b-e3b3-550a-83fe-0ac8ba0e13fd?c=42304
The change detector attributed this to commit 42304 whereas the regression is clearly the prior commit.
Make it easy to turn examples like this into test cases for the change
package.
We need a way to identify significant changes in benchmark result timeseries.
Currently the logs from watch
just say upserted commit <sha>
so we don't know whether the object was added or not. It would be good to determine from the firestore response whether an insert happened.
Daniel Marti's "What's coming in Go 1.15" talk highlights known performance improvements in Go 1.15. These serve as excellent examples of known diffs which would hopefully be detectable by continuous benchmarking.
Inspect these diffs manually and see if performance changes were picked up, and if not why not.
Implement CPU shielding something like: https://github.com/lpechacek/cpuset
Or just use the Ubuntu package.
Display improvement direction on significant changes view.
To support other features I think it's finally necessary to use a commit index, rather than date.
Create and regularly update a commit position table.
max_connections
Dynamic pages still don't change that often, so we should configure some short-term caching.
The benchmark view pages load very slowly. Investigate why and make it faster.
The system is detecting clearly spurious changes, for example at a commit that adds a name to the authors file. This is likely paranoia but one potential explanation is that for some reason the computation of commit index is not stable. For my sanity, verify this is not the case.
Graphs such as below suggest that timeseries ordering is not correct.
https://goperf.org/bench/9cdae867-65b9-5e52-96a2-af34ef9c62be
This graph should have a step change in it, but the scatter plot shows the lower "step" continues and overlaps the higher one. Inspecting some of the points suggests that the lower step actually comes from the dev.link
branch, which presumably still has an older version of the code. Meanwhile master
contains the performance regression, and development is happening concurrently on both branches.
This obscures what's really going on and makes it far harder to pinpoint exact commits responsible for a performance change. We need a more nuanced approach to ordering commits by time.
2020-05-04T18:16:26.748-0700 debug start initializing
2020-05-04T18:16:26.748-0700 info install toolchain {"toolchain": "snapshot/linux-amd64/c9d5f60eaa4450ccf1ce878d55b4c6a12843f2f3"}
2020-05-04T18:16:26.748-0700 debug start snapshot_install
2020-05-04T18:16:26.749-0700 info install snapshot {"builder_type": "linux-amd64", "go_revision": "c9d5f60eaa4450ccf1ce878d55b4c6a12843f2f3", "snapshot_url": "https://storage.googleapis.com/go-build-snap/go/linux-amd64/c9d5f60eaa4450ccf1ce878d55b4c6a12843f2f3.tar.gz"}
2020-05-04T18:16:26.749-0700 debug change working directory {"cwd": "/tmp/contbench842959164/sandbox/dl663998315"}
2020-05-04T18:16:26.749-0700 debug start download {"url": "https://storage.googleapis.com/go-build-snap/go/linux-amd64/c9d5f60eaa4450ccf1ce878d55b4c6a12843f2f3.tar.gz", "path": "/tmp/contbench842959164/sandbox/dl663998315/go.tar.gz"}
2020-05-04T18:32:36.460-0700 debug finish download {"duration": "16m9.711261542s"}
2020-05-04T18:32:36.460-0700 debug finish snapshot_install {"duration": "16m9.711539518s"}
2020-05-04T18:32:36.460-0700 debug finish initializing {"duration": "16m9.71162319s"}
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x48 pc=0x93dafc]
goroutine 1 [running]:
github.com/mmcloughlin/cb/pkg/runner.(*Workspace).Download(0xc000404f00, 0xc0001183f0, 0x6b, 0xc0003a0180, 0x35)
github.com/mmcloughlin/cb/pkg/runner/workspace.go:256 +0x42c
github.com/mmcloughlin/cb/pkg/runner.(*snapshot).Install(0xc000400300, 0xc000404f00, 0xc000354700, 0x1e)
github.com/mmcloughlin/cb/pkg/runner/toolchain.go:176 +0x627
github.com/mmcloughlin/cb/pkg/runner.(*Runner).Init(0xc000034380, 0xd0f220, 0xc0000dd500)
github.com/mmcloughlin/cb/pkg/runner/runner.go:50 +0x2d3
main.(*Processor).Process(0xc00031a420, 0xd0f220, 0xc0000dd500, 0xc000034180, 0xe6361c98ba214c82, 0x0, 0x0, 0x0)
github.com/mmcloughlin/cb/app/cmd/worker/run.go:116 +0x5b1
github.com/mmcloughlin/cb/app/worker.(*Worker).process(0xc0000ccbe0, 0xd0f220, 0xc0000dd500, 0xc000034180, 0x0, 0x0)
github.com/mmcloughlin/cb/app/worker/worker.go:133 +0x1a3
github.com/mmcloughlin/cb/app/worker.(*Worker).Run(0xc0000ccbe0, 0xd0f220, 0xc0000dd500, 0xc00025fdf8, 0x1)
github.com/mmcloughlin/cb/app/worker/worker.go:86 +0xd3
main.(*Run).Execute(0xc0000ccb90, 0xd0f220, 0xc0000dd500, 0xc0000c5440, 0x0, 0x0, 0x0, 0xc0001cddc0)
github.com/mmcloughlin/cb/app/cmd/worker/run.go:77 +0x257
github.com/google/subcommands.(*Commander).Execute(0xc0000aa080, 0xd0f220, 0xc0000dd500, 0x0, 0x0, 0x0, 0xc0000b2000)
github.com/google/[email protected]/subcommands.go:209 +0x2f9
github.com/google/subcommands.Execute(...)
github.com/google/[email protected]/subcommands.go:492
main.run(0xd0f220, 0xc0000dd500, 0xc0000c5320, 0xc00025ff78)
github.com/mmcloughlin/cb/app/cmd/worker/main.go:39 +0x240
github.com/mmcloughlin/cb/pkg/command.Run(0xc18bf0)
github.com/mmcloughlin/cb/pkg/command/command.go:33 +0xc0
main.main()
github.com/mmcloughlin/cb/app/cmd/worker/main.go:15 +0x2d
Figure out which GCP instance type to use.
If a worker process doesn't shut down cleanly, the sys
and shield
cpusets can be left around. This causes any subsequent attempts to setup a CPU shield to fail.
The shield logic could be made to handle the case where the cpusets already exist.
More descriptive <title>
tags.
Need to collect a benchmark suite. Places to look:
Don't want to accidentally spend thousands of dollars on this.
https://www.terraform.io/docs/providers/google/r/billing_budget.html
Need to fetch environment information and report it as configuration lines in the output.
https://github.com/golang/proposal/blob/master/design/14313-benchmark-format.md
commit: 7cd9055
commit-time: 2016-02-11T13:25:45-0500
goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-4980HQ CPU @ 2.80GHz
cpu-count: 8
cpu-physical-count: 4
os: Mac OS X 10.11.3
mem: 16 GB
Currently the runner just uses performance
scaling governor. Consider pinning frequency instead, similar to perflock
.
This project has evolved a lot and some approaches have been abandoned so it makes sense to delete the code. This issue just records which packages have been deleted (or should be soon) in case they are useful again later.
app/model
app/mapper
app/obj
fn/enqueue
app/consumer
app/launch
app/cmd/launcher
app/gce
script/dist.sh
fn/perfdataupload
Basic github actions CI job.
Make a basic about page.
std
value: 42,261, 7.11
is confusingA declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.