From: Hana Kim Date: Tue, 6 Feb 2018 18:21:39 +0000 (-0500) Subject: cmd/trace: add memory usage reporting X-Git-Tag: go1.11beta1~1495 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=a66af7280de998712d84eca40783019305b58bf3;p=gostls13.git cmd/trace: add memory usage reporting Enabled when the tool runs with DEBUG_MEMORY_USAGE=1 env var. After reporting the usage, it waits until user enters input (helpful when checking top or other memory monitor) Also adds net/http/pprof to export debug endpoints. From the trace included in #21870 $ DEBUG_MEMORY_USAGE=1 go tool trace trace.out 2018/02/21 16:04:49 Parsing trace... after parsing trace Alloc: 3385747848 Bytes Sys: 3661654648 Bytes HeapReleased: 0 Bytes HeapSys: 3488907264 Bytes HeapInUse: 3426377728 Bytes HeapAlloc: 3385747848 Bytes Enter to continue... 2018/02/21 16:05:09 Serializing trace... after generating trace Alloc: 4908929616 Bytes Sys: 5319063640 Bytes HeapReleased: 0 Bytes HeapSys: 5032411136 Bytes HeapInUse: 4982865920 Bytes HeapAlloc: 4908929616 Bytes Enter to continue... 2018/02/21 16:05:18 Splitting trace... after spliting trace Alloc: 4909026200 Bytes Sys: 5319063640 Bytes HeapReleased: 0 Bytes HeapSys: 5032411136 Bytes HeapInUse: 4983046144 Bytes HeapAlloc: 4909026200 Bytes Enter to continue... 2018/02/21 16:05:39 Opening browser. Trace viewer is listening on http://127.0.0.1:33661 after httpJsonTrace Alloc: 5288336048 Bytes Sys: 7790245896 Bytes HeapReleased: 0 Bytes HeapSys: 7381123072 Bytes HeapInUse: 5324120064 Bytes HeapAlloc: 5288336048 Bytes Enter to continue... Change-Id: I88bb3cb1af3cb62e4643a8cbafd5823672b2e464 Reviewed-on: https://go-review.googlesource.com/92355 Reviewed-by: Peter Weinberger --- diff --git a/src/cmd/trace/main.go b/src/cmd/trace/main.go index 592b999742..856d411f86 100644 --- a/src/cmd/trace/main.go +++ b/src/cmd/trace/main.go @@ -16,7 +16,10 @@ import ( "net" "net/http" "os" + "runtime" "sync" + + _ "net/http/pprof" // Required to use pprof ) const usageMessage = "" + @@ -115,6 +118,7 @@ func main() { trace.Print(res.Events) os.Exit(0) } + reportMemoryUsage("after parsing trace") log.Print("Serializing trace...") params := &traceParams{ @@ -125,9 +129,11 @@ func main() { if err != nil { dief("%v\n", err) } + reportMemoryUsage("after generating trace") log.Print("Splitting trace...") ranges = splitTrace(data) + reportMemoryUsage("after spliting trace") addr := "http://" + ln.Addr().String() log.Printf("Opening browser. Trace viewer is listening on %s", addr) @@ -210,3 +216,29 @@ func dief(msg string, args ...interface{}) { fmt.Fprintf(os.Stderr, msg, args...) os.Exit(1) } + +var debugMemoryUsage bool + +func init() { + v := os.Getenv("DEBUG_MEMORY_USAGE") + debugMemoryUsage = v != "" +} + +func reportMemoryUsage(msg string) { + if !debugMemoryUsage { + return + } + var s runtime.MemStats + runtime.ReadMemStats(&s) + w := os.Stderr + fmt.Fprintf(w, "%s\n", msg) + fmt.Fprintf(w, " Alloc:\t%d Bytes\n", s.Alloc) + fmt.Fprintf(w, " Sys:\t%d Bytes\n", s.Sys) + fmt.Fprintf(w, " HeapReleased:\t%d Bytes\n", s.HeapReleased) + fmt.Fprintf(w, " HeapSys:\t%d Bytes\n", s.HeapSys) + fmt.Fprintf(w, " HeapInUse:\t%d Bytes\n", s.HeapInuse) + fmt.Fprintf(w, " HeapAlloc:\t%d Bytes\n", s.HeapAlloc) + var dummy string + fmt.Printf("Enter to continue...") + fmt.Scanf("%s", &dummy) +} diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go index 6fa459c7c2..9a675aecec 100644 --- a/src/cmd/trace/trace.go +++ b/src/cmd/trace/trace.go @@ -163,6 +163,7 @@ func httpTraceViewerHTML(w http.ResponseWriter, r *http.Request) { // httpJsonTrace serves json trace, requested from within templTrace HTML. func httpJsonTrace(w http.ResponseWriter, r *http.Request) { + defer reportMemoryUsage("after httpJsonTrace") // This is an AJAX handler, so instead of http.Error we use log.Printf to log errors. res, err := parseTrace() if err != nil {