]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/trace: add memory usage reporting
authorHana Kim <hakim@google.com>
Tue, 6 Feb 2018 18:21:39 +0000 (13:21 -0500)
committerHyang-Ah Hana Kim <hyangah@gmail.com>
Wed, 21 Feb 2018 21:23:08 +0000 (21:23 +0000)
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 <pjw@google.com>
src/cmd/trace/main.go
src/cmd/trace/trace.go

index 592b999742be0079ac5fffd0b07ac9d889040a1f..856d411f869ec0d30529ac1d9d5cf6b4dcfefe66 100644 (file)
@@ -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)
+}
index 6fa459c7c23a8d8f529c33110735d5c605aefe2c..9a675aececeb423022226995854a49dcb78ad4f0 100644 (file)
@@ -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 {