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

cmd/trace: force GC occassionally

to return memory to the OS after completing potentially
large operations.

Update #21870

Sys went down to 3.7G

$ DEBUG_MEMORY_USAGE=1 go tool trace trace.out

2018/03/07 09:35:52 Parsing trace...
after parsing trace
 Alloc:	3385754360 Bytes
 Sys:	3662047864 Bytes
 HeapReleased:	0 Bytes
 HeapSys:	3488907264 Bytes
 HeapInUse:	3426549760 Bytes
 HeapAlloc:	3385754360 Bytes
Enter to continue...
2018/03/07 09:36:09 Splitting trace...
after spliting trace
 Alloc:	3238309424 Bytes
 Sys:	3684410168 Bytes
 HeapReleased:	0 Bytes
 HeapSys:	3488874496 Bytes
 HeapInUse:	3266461696 Bytes
 HeapAlloc:	3238309424 Bytes
Enter to continue...
2018/03/07 09:36:39 Opening browser. Trace viewer is listening on http://100.101.224.241:12345

after httpJsonTrace
 Alloc:	3000633872 Bytes
 Sys:	3693978424 Bytes
 HeapReleased:	0 Bytes
 HeapSys:	3488743424 Bytes
 HeapInUse:	3030966272 Bytes
 HeapAlloc:	3000633872 Bytes
Enter to continue...

Change-Id: I56f64cae66c809cbfbad03fba7bd0d35494c1d04
Reviewed-on: https://go-review.googlesource.com/92376Reviewed-by: 's avatarPeter Weinberger <pjw@google.com>
parent 20b14b71
...@@ -17,6 +17,7 @@ import ( ...@@ -17,6 +17,7 @@ import (
"net/http" "net/http"
"os" "os"
"runtime" "runtime"
"runtime/debug"
"sync" "sync"
_ "net/http/pprof" // Required to use pprof _ "net/http/pprof" // Required to use pprof
...@@ -119,10 +120,12 @@ func main() { ...@@ -119,10 +120,12 @@ func main() {
os.Exit(0) os.Exit(0)
} }
reportMemoryUsage("after parsing trace") reportMemoryUsage("after parsing trace")
debug.FreeOSMemory()
log.Print("Splitting trace...") log.Print("Splitting trace...")
ranges = splitTrace(res) ranges = splitTrace(res)
reportMemoryUsage("after spliting trace") reportMemoryUsage("after spliting trace")
debug.FreeOSMemory()
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)
......
...@@ -14,6 +14,7 @@ import ( ...@@ -14,6 +14,7 @@ import (
"net/http" "net/http"
"path/filepath" "path/filepath"
"runtime" "runtime"
"runtime/debug"
"strconv" "strconv"
"strings" "strings"
"time" "time"
...@@ -165,6 +166,7 @@ func httpTraceViewerHTML(w http.ResponseWriter, r *http.Request) { ...@@ -165,6 +166,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 debug.FreeOSMemory()
defer reportMemoryUsage("after httpJsonTrace") 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()
...@@ -293,6 +295,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) { ...@@ -293,6 +295,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) {
// so flush can include them in the required // so flush can include them in the required
// part of the trace. // part of the trace.
data.Events = append(data.Events, v) data.Events = append(data.Events, v)
return
} }
enc := json.NewEncoder(&cw) enc := json.NewEncoder(&cw)
enc.Encode(v) enc.Encode(v)
...@@ -1025,6 +1028,8 @@ func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer { ...@@ -1025,6 +1028,8 @@ func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer {
io.WriteString(w, ",") io.WriteString(w, ",")
} }
enc.Encode(v) enc.Encode(v)
// TODO: get rid of the extra \n inserted by enc.Encode.
// Same should be applied to splittingTraceConsumer.
written++ written++
}, },
consumeViewerFrame: func(k string, v ViewerFrame) { consumeViewerFrame: func(k string, v ViewerFrame) {
......
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