Commit a66af728 authored by Hana Kim's avatar Hana Kim Committed by Hyang-Ah Hana Kim

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/92355Reviewed-by: default avatarPeter Weinberger <pjw@google.com>
parent e2a86b6b
...@@ -16,7 +16,10 @@ import ( ...@@ -16,7 +16,10 @@ import (
"net" "net"
"net/http" "net/http"
"os" "os"
"runtime"
"sync" "sync"
_ "net/http/pprof" // Required to use pprof
) )
const usageMessage = "" + const usageMessage = "" +
...@@ -115,6 +118,7 @@ func main() { ...@@ -115,6 +118,7 @@ func main() {
trace.Print(res.Events) trace.Print(res.Events)
os.Exit(0) os.Exit(0)
} }
reportMemoryUsage("after parsing trace")
log.Print("Serializing trace...") log.Print("Serializing trace...")
params := &traceParams{ params := &traceParams{
...@@ -125,9 +129,11 @@ func main() { ...@@ -125,9 +129,11 @@ func main() {
if err != nil { if err != nil {
dief("%v\n", err) dief("%v\n", err)
} }
reportMemoryUsage("after generating trace")
log.Print("Splitting trace...") log.Print("Splitting trace...")
ranges = splitTrace(data) ranges = splitTrace(data)
reportMemoryUsage("after spliting trace")
addr := "http://" + ln.Addr().String() addr := "http://" + ln.Addr().String()
log.Printf("Opening browser. Trace viewer is listening on %s", addr) log.Printf("Opening browser. Trace viewer is listening on %s", addr)
...@@ -210,3 +216,29 @@ func dief(msg string, args ...interface{}) { ...@@ -210,3 +216,29 @@ func dief(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg, args...) fmt.Fprintf(os.Stderr, msg, args...)
os.Exit(1) 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)
}
...@@ -163,6 +163,7 @@ func httpTraceViewerHTML(w http.ResponseWriter, r *http.Request) { ...@@ -163,6 +163,7 @@ func httpTraceViewerHTML(w http.ResponseWriter, r *http.Request) {
// httpJsonTrace serves json trace, requested from within templTrace HTML. // httpJsonTrace serves json trace, requested from within templTrace HTML.
func httpJsonTrace(w http.ResponseWriter, r *http.Request) { 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. // This is an AJAX handler, so instead of http.Error we use log.Printf to log errors.
res, err := parseTrace() res, err := parseTrace()
if err != nil { if err != nil {
......
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