mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: Profile goroutines holding contended mutexes.
runtime.SetMutexProfileFraction(n int) will capture 1/n-th of stack
traces of goroutines holding contended mutexes if n > 0. From runtime/pprof,
pprot.Lookup("mutex").WriteTo writes the accumulated
stack traces to w (in essentially the same format that blocking
profiling uses).
Change-Id: Ie0b54fa4226853d99aa42c14cb529ae586a8335a
Reviewed-on: https://go-review.googlesource.com/29650
Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
b679665a18
commit
ca922b6d36
15 changed files with 286 additions and 39 deletions
|
|
@ -592,6 +592,42 @@ func blockCond() {
|
|||
mu.Unlock()
|
||||
}
|
||||
|
||||
func TestMutexProfile(t *testing.T) {
|
||||
old := runtime.SetMutexProfileFraction(1)
|
||||
defer runtime.SetMutexProfileFraction(old)
|
||||
if old != 0 {
|
||||
t.Fatalf("need MutexProfileRate 0, got %d", old)
|
||||
}
|
||||
|
||||
blockMutex()
|
||||
|
||||
var w bytes.Buffer
|
||||
Lookup("mutex").WriteTo(&w, 1)
|
||||
prof := w.String()
|
||||
|
||||
if !strings.HasPrefix(prof, "--- mutex:\ncycles/second=") {
|
||||
t.Errorf("Bad profile header:\n%v", prof)
|
||||
}
|
||||
prof = strings.Trim(prof, "\n")
|
||||
lines := strings.Split(prof, "\n")
|
||||
if len(lines) != 6 {
|
||||
t.Errorf("expected 6 lines, got %d %q\n%s", len(lines), prof, prof)
|
||||
}
|
||||
if len(lines) < 6 {
|
||||
return
|
||||
}
|
||||
// checking that the line is like "35258904 1 @ 0x48288d 0x47cd28 0x458931"
|
||||
r2 := `^\d+ 1 @(?: 0x[[:xdigit:]]+)+`
|
||||
//r2 := "^[0-9]+ 1 @ 0x[0-9a-f x]+$"
|
||||
if ok, err := regexp.MatchString(r2, lines[3]); err != nil || !ok {
|
||||
t.Errorf("%q didn't match %q", lines[3], r2)
|
||||
}
|
||||
r3 := "^#.*runtime/pprof_test.blockMutex.*$"
|
||||
if ok, err := regexp.MatchString(r3, lines[5]); err != nil || !ok {
|
||||
t.Errorf("%q didn't match %q", lines[5], r3)
|
||||
}
|
||||
}
|
||||
|
||||
func func1(c chan int) { <-c }
|
||||
func func2(c chan int) { <-c }
|
||||
func func3(c chan int) { <-c }
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue