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 (
"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)
}
......@@ -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 {
......
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