1
0
mirror of https://github.com/golang/go synced 2024-11-23 19:00:04 -07:00

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 <pjw@google.com>
This commit is contained in:
Hana Kim 2018-02-06 14:56:30 -05:00 committed by Hyang-Ah Hana Kim
parent 20b14b71df
commit 93b0261d0a
2 changed files with 8 additions and 0 deletions

View File

@ -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)

View File

@ -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) {