aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorAustin Clements <austin@google.com>2017-07-28 16:26:51 -0400
committerAustin Clements <austin@google.com>2018-11-05 19:10:23 +0000
commitbef4efc822794ea2e7310756bc546bf6930fc066 (patch)
treee09e7807af84adcda98c4863f0a912cccc601171 /src/cmd
parent27920c8ddc609662540deaf5a3d3b4fce03abeea (diff)
downloadgo-bef4efc822794ea2e7310756bc546bf6930fc066.tar.xz
internal/trace: add "per-P" MMU analysis
The current MMU analysis considers all Ps together, so if, for example, one of four Ps is blocked, mutator utilization is 75%. However, this is less useful for understanding the impact on individual goroutines because that one blocked goroutine could be blocked for a very long time, but we still appear to have good utilization. Hence, this introduces a new flag that does a "per-P" analysis where the utilization of each P is considered independently. The MMU is then the combination of the MMU for each P's utilization function. Change-Id: Id67b980d4d82b511d28300cdf92ccbb5ae8f0c78 Reviewed-on: https://go-review.googlesource.com/c/60797 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/trace/mmu.go15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/cmd/trace/mmu.go b/src/cmd/trace/mmu.go
index 2a07be4ba2..d3b6768686 100644
--- a/src/cmd/trace/mmu.go
+++ b/src/cmd/trace/mmu.go
@@ -27,12 +27,12 @@ func init() {
var mmuCache struct {
init sync.Once
- util []trace.MutatorUtil
+ util [][]trace.MutatorUtil
mmuCurve *trace.MMUCurve
err error
}
-func getMMUCurve() ([]trace.MutatorUtil, *trace.MMUCurve, error) {
+func getMMUCurve() ([][]trace.MutatorUtil, *trace.MMUCurve, error) {
mmuCache.init.Do(func() {
tr, err := parseTrace()
if err != nil {
@@ -69,7 +69,16 @@ func httpMMUPlot(w http.ResponseWriter, r *http.Request) {
// Cover six orders of magnitude.
xMax := xMin * 1e6
// But no more than the length of the trace.
- if maxMax := time.Duration(mu[len(mu)-1].Time - mu[0].Time); xMax > maxMax {
+ minEvent, maxEvent := mu[0][0].Time, mu[0][len(mu[0])-1].Time
+ for _, mu1 := range mu[1:] {
+ if mu1[0].Time < minEvent {
+ minEvent = mu1[0].Time
+ }
+ if mu1[len(mu1)-1].Time > maxEvent {
+ maxEvent = mu1[len(mu1)-1].Time
+ }
+ }
+ if maxMax := time.Duration(maxEvent - minEvent); xMax > maxMax {
xMax = maxMax
}
// Compute MMU curve.