Commit 9d332a83 authored by Dmitry Vyukov's avatar Dmitry Vyukov

cmd/trace: dump thread id on proc start

Augment ProcStart events with OS thread id.
This helps in scheduler locality analysis.

Change-Id: I93fea75d3072cf68de66110d0b59d07101badcb5
Reviewed-on: https://go-review.googlesource.com/7302Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent b2843bec
...@@ -391,7 +391,14 @@ func (ctx *traceContext) emitThreadCounters(ev *trace.Event) { ...@@ -391,7 +391,14 @@ func (ctx *traceContext) emitThreadCounters(ev *trace.Event) {
} }
func (ctx *traceContext) emitInstant(ev *trace.Event, name string) { func (ctx *traceContext) emitInstant(ev *trace.Event, name string) {
ctx.emit(&ViewerEvent{Name: name, Phase: "I", Scope: "t", Time: ctx.time(ev), Tid: ctx.proc(ev), Stack: ctx.stack(ev.Stk)}) var arg interface{}
if ev.Type == trace.EvProcStart {
type Arg struct {
ThreadID uint64
}
arg = &Arg{ev.Args[0]}
}
ctx.emit(&ViewerEvent{Name: name, Phase: "I", Scope: "t", Time: ctx.time(ev), Tid: ctx.proc(ev), Stack: ctx.stack(ev.Stk), Arg: arg})
} }
func (ctx *traceContext) emitArrow(ev *trace.Event, name string) { func (ctx *traceContext) emitArrow(ev *trace.Event, name string) {
......
...@@ -584,7 +584,7 @@ const ( ...@@ -584,7 +584,7 @@ const (
EvFrequency = 2 // contains tracer timer frequency [frequency (ticks per second)] EvFrequency = 2 // contains tracer timer frequency [frequency (ticks per second)]
EvStack = 3 // stack [stack id, number of PCs, array of PCs] EvStack = 3 // stack [stack id, number of PCs, array of PCs]
EvGomaxprocs = 4 // current value of GOMAXPROCS [timestamp, GOMAXPROCS, stack id] EvGomaxprocs = 4 // current value of GOMAXPROCS [timestamp, GOMAXPROCS, stack id]
EvProcStart = 5 // start of P [timestamp] EvProcStart = 5 // start of P [timestamp, thread id]
EvProcStop = 6 // stop of P [timestamp] EvProcStop = 6 // stop of P [timestamp]
EvGCStart = 7 // GC start [timestamp, stack id] EvGCStart = 7 // GC start [timestamp, stack id]
EvGCDone = 8 // GC done [timestamp] EvGCDone = 8 // GC done [timestamp]
...@@ -628,7 +628,7 @@ var EventDescriptions = [EvCount]struct { ...@@ -628,7 +628,7 @@ var EventDescriptions = [EvCount]struct {
EvFrequency: {"Frequency", false, []string{"freq"}}, EvFrequency: {"Frequency", false, []string{"freq"}},
EvStack: {"Stack", false, []string{"id", "siz"}}, EvStack: {"Stack", false, []string{"id", "siz"}},
EvGomaxprocs: {"Gomaxprocs", true, []string{"procs"}}, EvGomaxprocs: {"Gomaxprocs", true, []string{"procs"}},
EvProcStart: {"ProcStart", false, []string{}}, EvProcStart: {"ProcStart", false, []string{"thread"}},
EvProcStop: {"ProcStop", false, []string{}}, EvProcStop: {"ProcStop", false, []string{}},
EvGCStart: {"GCStart", true, []string{}}, EvGCStart: {"GCStart", true, []string{}},
EvGCDone: {"GCDone", false, []string{}}, EvGCDone: {"GCDone", false, []string{}},
......
...@@ -101,7 +101,7 @@ func TestTraceStress(t *testing.T) { ...@@ -101,7 +101,7 @@ func TestTraceStress(t *testing.T) {
<-done <-done
wg.Done() wg.Done()
}() }()
time.Sleep(time.Millisecond) time.Sleep(time.Millisecond) // give the goroutine above time to block
buf := new(bytes.Buffer) buf := new(bytes.Buffer)
if err := StartTrace(buf); err != nil { if err := StartTrace(buf); err != nil {
...@@ -109,6 +109,7 @@ func TestTraceStress(t *testing.T) { ...@@ -109,6 +109,7 @@ func TestTraceStress(t *testing.T) {
} }
procs := runtime.GOMAXPROCS(10) procs := runtime.GOMAXPROCS(10)
time.Sleep(50 * time.Millisecond) // test proc stop/start events
go func() { go func() {
runtime.LockOSThread() runtime.LockOSThread()
......
...@@ -21,7 +21,7 @@ const ( ...@@ -21,7 +21,7 @@ const (
traceEvFrequency = 2 // contains tracer timer frequency [frequency (ticks per second)] traceEvFrequency = 2 // contains tracer timer frequency [frequency (ticks per second)]
traceEvStack = 3 // stack [stack id, number of PCs, array of PCs] traceEvStack = 3 // stack [stack id, number of PCs, array of PCs]
traceEvGomaxprocs = 4 // current value of GOMAXPROCS [timestamp, GOMAXPROCS, stack id] traceEvGomaxprocs = 4 // current value of GOMAXPROCS [timestamp, GOMAXPROCS, stack id]
traceEvProcStart = 5 // start of P [timestamp] traceEvProcStart = 5 // start of P [timestamp, thread id]
traceEvProcStop = 6 // stop of P [timestamp] traceEvProcStop = 6 // stop of P [timestamp]
traceEvGCStart = 7 // GC start [timestamp, stack id] traceEvGCStart = 7 // GC start [timestamp, stack id]
traceEvGCDone = 8 // GC done [timestamp] traceEvGCDone = 8 // GC done [timestamp]
...@@ -716,7 +716,7 @@ func traceGomaxprocs(procs int32) { ...@@ -716,7 +716,7 @@ func traceGomaxprocs(procs int32) {
} }
func traceProcStart() { func traceProcStart() {
traceEvent(traceEvProcStart, -1) traceEvent(traceEvProcStart, -1, uint64(getg().m.id))
} }
func traceProcStop(pp *p) { func traceProcStop(pp *p) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment