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/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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue