blob: 81e5aa529dcc4b4ed4fb12ae4513800a7d7878b8 [file] [log] [blame] [view]
Andrew Gerrand5bc444d2014-12-10 11:35:11 +11001# Introduction
2
3[Performance Dashboard](http://build.golang.org/perf) does continuous monitoring of performance characteristics of the Go implementation. It notifies codereview threads about any significant changes caused by the commit, allows to see performance changes caused by [recent commits](http://build.golang.org/perf), allows to investigate changes [in detail](http://build.golang.org/perfdetail?commit=fb3d6c1631c3f3141f33a01afb4c0a23ef0ea2cf&commit0=82f48826c6c79a3d5697d5e06cac8451f3dc3c7f&kind=builder&builder=linux-amd64-perf&benchmark=http) as well as shows [graphical representation](http://build.golang.org/perfgraph) of performance dynamics.
4
5# Builders
6
7The dashboard uses two builders: linux-amd64 running Ubuntu 14.04 and windows-amd64 running Windows 8.1. Both builders has the same hardware: 2 x Intel Xeon E5620 @ 2.4GHz, 8 HT cores, 12GB RAM.
8
9# Benchmarks
10
nathany5d5229b2014-12-10 22:28:24 -080011The builders run benchmarks from the [x/benchmarks](https://golang.org/x/benchmarks) repo:
Andrew Gerrand5bc444d2014-12-10 11:35:11 +110012 * ` json `: marshals and unmarshals large json object, in several goroutines independently.
13 * ` http `: http client and server serving "hello world", uses persistent connections and read/write timeouts.
14 * ` garbage `: parses net package using go/parser, in a loop in several goroutines; half of packages are instantly discarded, the other half is preserved indefinitely; this creates significant pressure on the garbage collector.
15 * ` build `: does 'go build -a std'.
16
17# Metrics
18
19Metrics collected are:
20 * ` allocated `: amount of memory allocated, per iteration, in bytes
21 * ` allocs `: number of memory allocations, per iteration
22 * ` cputime `: total CPU time (user+sys from time Unix utility output), can be larger than time when GOMAXPROCS>1, per iteration, in ns
23 * ` gc-pause-one `: duration of a single garbage collector pause, in ns
24 * ` gc-pause-total `: total duration of garbage collector pauses, per iteration, ns
25 * ` latency-50/95/99 `: request latency percentile, in ns
26 * ` rss `: max memory consumption as reported by OS, in bytes
27 * ` sys-gc `: memory consumed by garbage collector metadata (` MemStats.GCSys `), in bytes
28 * ` sys-heap `: memory consumed by heap (` MemStats.HeapSys `), in bytes
29 * ` sys-other `: unclassified memory consumption (` MemStats.OtherSys `), in bytes
30 * ` sys-stack `: memory consumed by stacks (` MemStats.StackSys `), in bytes
31 * ` sys-total `: total memory allocated from OS (` MemStats.Sys `), in bytes
32 * ` time `: real time (essentially the same as std Go benchmarks output), per iteration, in ns
33 * ` virtual-mem `: virtual memory consumption as reported by OS, in bytes
34
35And for build benchmark:
36 * ` binary-size `: size of the go command, in bytes
37 * ` build-cputime `: CPU time spent on the build, in ns
38 * ` build-rss `: max memory consumption of the build process as reported by OS, in bytes
39 * ` build-time `: real time of the build, in ns
40
41# Profiles
42
43The dashboard also collects a set of profiles for every commit, they are available from the [details page](http://build.golang.org/perfdetail?commit=fb3d6c1631c3f3141f33a01afb4c0a23ef0ea2cf&commit0=82f48826c6c79a3d5697d5e06cac8451f3dc3c7f&kind=builder&builder=linux-amd64-perf&benchmark=http). For usual benchmarks [CPU](http://build.golang.org/log/b023711522ca6511f2c9bfb46cdfb511fd77e967) and [memory](http://build.golang.org/log/06bd072aa0dec4936a05b7aa13b9f906b6989865) profiles are collected. For build benchmark - [perf profile](http://build.golang.org/log/34c4f0c7b7ea3521e5356b91775a026607e72d44), [per-process split of CPU time](http://build.golang.org/log/da517b4f6892af8a6b4900dbe58311b665ced00f) and [per-section size](http://build.golang.org/log/fc4287d6a9e280bf35c572c038dbc4414d60bcf8).
44
45# Perf Changes View
46
47The [view](http://build.golang.org/perf) allows to see aggregate information about significant performance changes caused by recent commits.
48
49Rows:
50 * The first row shows difference between the latest release and tip.
51 * The rest of the rows show deltas caused by individual commits.
52
53Columns:
54 * The first column is commit hash.
55 * Second - number of benchmarks that were executed for the commit to far.
56 * Third - metric name, or the special 'failure' metric for build/runtime crashes.
57 * Fourth - negative deltas.
58 * Fifth - positive deltas.
59 * The rest describe commit.
60
61You can click on any positive/negative delta to see details about the change.
62
63# Perf Graphs View
64
65The [view](http://build.golang.org/perfgraph) shows dynamics of performance metrics in graphical form.
66
67On the left pane you select one or more builders, benchmarks, metrics, GOMAXPROCS values as well as commit range, and click Refresh to update the graph.
68
69If you hover over the graph, you see information about the commit and metric values. You can zoom in/out by scrolling (mouse wheel), and see older/newer commits by dragging the graph. Right mouse click on the graph resets view to initial.
70
71All lines are normalized to their starting point. The first point is always 1.0, and the rest are relative to the first point.