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/ead268f8-3eb2-4cdc-b312-6e414bc0bce5n%40googlegroups.com.