]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/trace: force GC occassionally
authorHana Kim <hakim@google.com>
Tue, 6 Feb 2018 19:56:30 +0000 (14:56 -0500)
committerHyang-Ah Hana Kim <hyangah@gmail.com>
Wed, 7 Mar 2018 14:39:25 +0000 (14:39 +0000)
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>
src/cmd/trace/main.go
src/cmd/trace/trace.go

index c7b6a647e36e0f651b1ebd70a451585706f058a5..5a856972b859f4e5f0268afa5eb109a67e8979d5 100644 (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)
index fb2d3058de37a63126159bae7619243bed8ecb4a..7dd8a87d94768694fdea233b27b4b8ed044f596b 100644 (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) {