From: Hana Kim Date: Tue, 6 Feb 2018 19:56:30 +0000 (-0500) Subject: cmd/trace: force GC occassionally X-Git-Tag: go1.11beta1~1310 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=93b0261d0a5e1981679b11b3429226258f925551;p=gostls13.git 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/92376 Reviewed-by: Peter Weinberger --- diff --git a/src/cmd/trace/main.go b/src/cmd/trace/main.go index c7b6a647e3..5a856972b8 100644 --- a/src/cmd/trace/main.go +++ b/src/cmd/trace/main.go @@ -17,6 +17,7 @@ import ( "net/http" "os" "runtime" + "runtime/debug" "sync" _ "net/http/pprof" // Required to use pprof @@ -119,10 +120,12 @@ func main() { os.Exit(0) } reportMemoryUsage("after parsing trace") + debug.FreeOSMemory() log.Print("Splitting trace...") ranges = splitTrace(res) reportMemoryUsage("after spliting trace") + debug.FreeOSMemory() addr := "http://" + ln.Addr().String() log.Printf("Opening browser. Trace viewer is listening on %s", addr) diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go index fb2d3058de..7dd8a87d94 100644 --- a/src/cmd/trace/trace.go +++ b/src/cmd/trace/trace.go @@ -14,6 +14,7 @@ import ( "net/http" "path/filepath" "runtime" + "runtime/debug" "strconv" "strings" "time" @@ -165,6 +166,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 debug.FreeOSMemory() defer reportMemoryUsage("after httpJsonTrace") // This is an AJAX handler, so instead of http.Error we use log.Printf to log errors. res, err := parseTrace() @@ -293,6 +295,7 @@ func splittingTraceConsumer(max int) (*splitter, traceConsumer) { // so flush can include them in the required // part of the trace. data.Events = append(data.Events, v) + return } enc := json.NewEncoder(&cw) enc.Encode(v) @@ -1025,6 +1028,8 @@ func viewerDataTraceConsumer(w io.Writer, start, end int64) traceConsumer { io.WriteString(w, ",") } enc.Encode(v) + // TODO: get rid of the extra \n inserted by enc.Encode. + // Same should be applied to splittingTraceConsumer. written++ }, consumeViewerFrame: func(k string, v ViewerFrame) {