mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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 <pjw@google.com>
This commit is contained in:
parent
e2a86b6bd9
commit
a66af7280d
2 changed files with 33 additions and 0 deletions
|
|
@ -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() {
|
||||||
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() {
|
||||||
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{}) {
|
||||||
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) {
|
||||||
|
|
||||||
// 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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue