The memory usage of containers are ever increasing and has grown from 100 MB to ~ 1 GB in couple of hours. Not able to understand where the gap is, even though the the builder is being reset. Would keeping a sync.Pool of builders help here?
Regards On Sunday, August 30, 2020 at 8:55:15 PM UTC+5:30 Sarath Prabath Redlapalli Jaya wrote: > Hi, we've been observing high memory usage in the following code > https://github.com/Masterminds/squirrel/blob/master/placeholder.go#L113 > > We measured from pprof of heap > > (pprof) top20 > > Showing nodes accounting for 360.07MB, 91.31% of 394.32MB total > > Dropped 142 nodes (cum <= 1.97MB) > > Showing top 20 nodes out of 139 > > flat flat% sum% cum cum% > > 101.21MB 25.67% 25.67% 101.21MB 25.67% bytes.(*Buffer).String > > 48.01MB 12.18% 37.84% 48.01MB 12.18% > github.com/newrelic/go-agent/v3/newrelic.(*spanAttributeMap).add > > 42.61MB 10.81% 48.65% 43.11MB 10.93% > github.com/newrelic/go-agent/v3/newrelic.(*txnTrace).witnessNode > > 38.54MB 9.77% 58.42% 38.54MB 9.77% > go.uber.org/zap/buffer.NewPool.func1 > > 19MB 4.82% 63.24% 19MB 4.82% > github.com/newrelic/go-agent/v3/newrelic.segmentEnd.spanEvent > > 16.51MB 4.19% 67.43% 91.04MB 23.09% > github.com/newrelic/go-agent/v3/newrelic.endDatastoreSegment > > 14.01MB 3.55% 70.98% 18.01MB 4.57% > github.com/newrelic/go-agent/v3/newrelic.newTxn > > 13.51MB 3.43% 74.41% 93.13MB 23.62% > github.com/newrelic/go-agent/v3/newrelic.endExternalSegment > > 12.01MB 3.05% 77.45% 12.01MB 3.05% > github.com/newrelic/go-agent/v3/newrelic.getStackTrace > > 10.51MB 2.66% 80.12% 10.51MB 2.66% > github.com/newrelic/go-agent/v3/newrelic.(*slowQueries).insertAtIndex > > 8MB 2.03% 82.15% 8MB 2.03% > github.com/newrelic/go-agent/v3/newrelic.newSlowQueries > > 6.51MB 1.65% 85.73% 6.51MB 1.65% > github.com/DataDog/datadog-go/statsd.newStatsdBuffer > > 4MB 1.01% 86.75% 52.01MB 13.19% > github.com/newrelic/go-agent/v3/newrelic.(*spanAttributeMap).addString > > 3.50MB 0.89% 87.64% 3.50MB 0.89% > go.uber.org/zap.(*Logger).clone > > 3.50MB 0.89% 88.52% 3.50MB 0.89% > github.com/newrelic/go-agent/v3/newrelic.externalMetricKey.scopedMetric > > 3MB 0.76% 89.28% 3MB 0.76% > github.com/newrelic/go-agent/v3/newrelic.addUserAttribute > > 3MB 0.76% 90.05% 3MB 0.76% strings.(*Builder).WriteString > > 2.50MB 0.63% 90.68% 6.06MB 1.54% encoding/json.Unmarshal > > 2.50MB 0.63% 91.31% 2.50MB 0.63% context.(*cancelCtx).Done > > ===== > > Resetting the buffer by defer didn't help either. So moved to string > builder like this > > func replacePositionalPlaceholders(sql, prefix string) (string, error) { > buf := &strings.Builder{} > defer buf.Reset() > > i := 0 > for { > p := strings.Index(sql, "?") > if p == -1 { > break > } > > if len(sql[p:]) > 1 && sql[p:p+2] == "??" { // escape ?? => ? > buf.WriteString(sql[:p]) > buf.WriteString("?") > if len(sql[p:]) == 1 { > break > } > sql = sql[p+2:] > } else { > i++ > buf.WriteString(sql[:p]) > fmt.Fprintf(buf, "%s%d", prefix, i) > sql = sql[p+1:] > } > } > > buf.WriteString(sql) > return buf.String(), nil > } > > ====== > > This didn't help either, from the results below > > (pprof) top20 > > Showing nodes accounting for 220.09MB, 90.37% of 243.55MB total > > Dropped 126 nodes (cum <= 1.22MB) > > Showing top 20 nodes out of 135 > > flat flat% sum% cum cum% > > 33.97MB 13.95% 13.95% 33.97MB 13.95% strings.(*Builder).Write > > 29.07MB 11.94% 25.89% 29.57MB 12.14% > github.com/newrelic/go-agent/v3/newrelic.(*txnTrace).witnessNode > > 28.01MB 11.50% 37.39% 28.01MB 11.50% > github.com/newrelic/go-agent/v3/newrelic.(*spanAttributeMap).add > > 24.34MB 9.99% 47.38% 24.34MB 9.99% strings.(*Builder).WriteString > > 18.52MB 7.60% 54.98% 18.52MB 7.60% > go.uber.org/zap/buffer.NewPool.func1 > > 11.01MB 4.52% 59.50% 60.59MB 24.88% > github.com/newrelic/go-agent/v3/newrelic.endExternalSegment > > 10.01MB 4.11% 63.61% 13.51MB 5.55% > github.com/newrelic/go-agent/v3/newrelic.newTxn > > 10MB 4.11% 67.72% 10MB 4.11% > github.com/newrelic/go-agent/v3/newrelic.segmentEnd.spanEvent > > 7MB 2.88% 73.73% 7MB 2.88% > github.com/newrelic/go-agent/v3/newrelic.(*slowQueries).insertAtIndex > > 7MB 2.88% 76.60% 50.02MB 20.54% > github.com/newrelic/go-agent/v3/newrelic.endDatastoreSegment > > 6.51MB 2.67% 79.28% 6.51MB 2.67% > github.com/DataDog/datadog-go/statsd.newStatsdBuffer > > 6MB 2.46% 81.74% 6.50MB 2.67% > github.com/newrelic/go-agent/v3/newrelic.addUserAttribute > > 5.50MB 2.26% 84.00% 5.50MB 2.26% > github.com/newrelic/go-agent/v3/newrelic.getStackTrace > > 3MB 1.23% 85.23% 3MB 1.23% > github.com/newrelic/go-agent/v3/newrelic.newSlowQueries > > 3MB 1.23% 86.47% 3MB 1.23% > go.uber.org/zap.(*Logger).clone > > 3MB 1.23% 87.70% 3MB 1.23% > github.com/newrelic/go-agent/v3/newrelic.externalMetricKey.scopedMetric > > 2.50MB 1.03% 88.72% 30.51MB 12.53% > github.com/newrelic/go-agent/v3/newrelic.(*spanAttributeMap).addString > > 2MB 0.82% 90.37% 2MB 0.82% encoding/hex.EncodeToString > > (pprof) peek Write > > Showing nodes accounting for 243.55MB, 100% of 243.55MB total > > ----------------------------------------------------------+------------- > > flat flat% sum% cum cum% calls calls% + context > > ----------------------------------------------------------+------------- > > 33.97MB 100% | fmt.Fprintf > > 33.97MB 13.95% 13.95% 33.97MB 13.95% | > strings.(*Builder).Write > > ----------------------------------------------------------+------------- > > 22.34MB 91.78% | > github.com/XXXXX/squirrel.replacePositionalPlaceholders > > 2MB 8.22% | > net/url.(*URL).String > > 24.34MB 9.99% 23.94% 24.34MB 9.99% | > strings.(*Builder).WriteString > > ----------------------------------------------------------+------------- > > 1.16MB 100% | > encoding/json.compact > > 0 0% 23.94% 1.16MB 0.48% | > bytes.(*Buffer).Write > > 1.16MB 100% | > bytes.(*Buffer).grow > > ----------------------------------------------------------+------------- > > 6.51MB 100% | > github.com/DataDog/datadog-go/statsd.New > > 0 0% 23.94% 6.51MB 2.67% | > github.com/DataDog/datadog-go/statsd.newWithWriter > > 6.51MB 100% | > github.com/DataDog/datadog-go/statsd.newBufferPool > > ----------------------------------------------------------+------------- > > 12.01MB 100% | > go.uber.org/zap.(*SugaredLogger).log > > 0 0% 23.94% 12.01MB 4.93% | > go.uber.org/zap/zapcore.(*CheckedEntry).Write > > 12.01MB 100% | > go.uber.org/zap/zapcore.(*ioCore).Write > > ----------------------------------------------------------+------------- > > 12.01MB 100% | > go.uber.org/zap/zapcore.(*CheckedEntry).Write > > 0 0% 23.94% 12.01MB 4.93% | > go.uber.org/zap/zapcore.(*ioCore).Write > > 12.01MB 100% | > go.uber.org/zap/zapcore.consoleEncoder.EncodeEntry > > ----------------------------------------------------------+------------- > > 1MB 100% | > golang.org/x/net/http2.(*Framer).readMetaFrame > > 0 0% 23.94% 1MB 0.41% | > golang.org/x/net/http2/hpack.(*Decoder).Write > > 1MB 100% | > golang.org/x/net/http2/hpack.(*Decoder).parseHeaderFieldRepr > > ----------------------------------------------------------+------------- > > (pprof) > > > Please help how to debug this more > > > Regards > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/c28ac10f-ea81-411d-9236-b4ec476f8109n%40googlegroups.com.